You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:36:03