Java中如何区分签名相同的构造器以正确设置不同颜色病毒计数
问题根因
你遇到的问题本质是两个Java语法限制导致的:
- Java构造器重载的判定只和参数的数量、类型、顺序相关,和参数名无关,因此你声明多个仅参数名不同的单int参数构造器会触发签名冲突,无法通过编译
- 你后续写的带
void返回值的AttackVirus方法不属于构造器,构造器没有返回值声明,加了void就变成普通成员方法,无法通过new关键字调用
可行解决方案
方案1:使用静态工厂方法(最推荐)
不用依赖构造器重载,直接声明不同名称的静态方法创建对应颜色的实例,你可以把统计好的所有颜色计数统一传入,保证每个实例都包含全量的颜色统计值,符合你要求的最终实例结构:
首先在AttackVirus类中补充以下代码:
// 补一个无参构造器方便实例化 public AttackVirus() {} // 红色病毒实例的静态工厂方法,其余颜色只需要修改type赋值即可 public static AttackVirus createRedInstance(int redCount, int blueCount, int yellowCount, int blackCount, int greenCount, int blockedCount, String time) { AttackVirus instance = new AttackVirus(); instance.type = "red"; instance.redVirus = redCount; instance.blueVirus = blueCount; instance.yellowVirus = yellowCount; instance.blackVirus = blackCount; instance.greenVirus = greenCount; instance.blockedVirusCount = blockedCount; // 时间赋值复用原有逻辑 SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { instance.time = formatter.parse(time); } catch (Exception e) { System.out.println("AttackVirus Date Format Error!" + e); } return instance; }
统计计数后的调用逻辑:
// 先统计完全部颜色的总数量再创建实例 int redVirus = 0, blueVirus = 0, yellowVirus = 0, blackVirus = 0, greenVirus = 0; for (int i = 0; i < virusList.size(); i++) { String type = virusList.get(i).getType(); if (type.equalsIgnoreCase("red")) redVirus++; else if (type.equalsIgnoreCase("blue")) blueVirus++; // 其余颜色计数逻辑同理 } // 创建对应颜色的实例 AttackVirus numRed = AttackVirus.createRedInstance(redVirus, blueVirus, yellowVirus, blackVirus, greenVirus, 1, "2021-10-25 15:48:00"); // 其余颜色实例创建逻辑同理
方案2:新增带枚举参数的构造器
通过新增枚举参数区分构造器签名,避免和原有单int构造器冲突:
首先定义颜色枚举:
public enum VirusColor { RED, BLUE, YELLOW, BLACK, GREEN }
在AttackVirus类中补充构造器:
public AttackVirus(VirusColor color, int count) { switch (color) { case RED: this.redVirus = count; this.type = "red"; break; case BLUE: this.blueVirus = count; this.type = "blue"; break; // 其余颜色分支同理 } // 时间、其他颜色计数可以后续通过Setter补充赋值 }
调用方式:AttackVirus numRed = new AttackVirus(VirusColor.RED, redVirus);
方案3:使用Setter方法赋值
如果不想修改现有类的核心结构,直接给每个字段补充Setter方法,实例化后手动赋值即可:
// AttackVirus类中补充Setter方法 public void setRedVirus(int redVirus) { this.redVirus = redVirus; } public void setType(String type) { this.type = type; } // 其余字段的Setter同理
调用逻辑:
AttackVirus numRed = new AttackVirus(); numRed.setRedVirus(redVirus); numRed.setType("red"); // 其余字段赋值同理
内容的提问来源于stack exchange,提问作者unusualsuspect
相关产品推荐
相关产品推荐

