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

Java初始化阶段将创建的对象存入ArrayList的问题

解决Ship对象存入静态ArrayList的问题

你的思路是对的,在构造方法中添加shipObs.add(this)就能实现对象跟踪,但问题出在添加的时机不对,以及当前的名称校验逻辑可以优化。

问题分析

你当前的构造方法中,如果检测到名称重复会直接return,但此时如果shipObs.add(this)放在错误位置,要么会把未完成初始化的无效Ship实例加入列表,要么根本没执行到添加逻辑,导致看似“无法生效”。

修正方案

  1. 简化名称校验逻辑:用ships.contains(name)直接判断名称是否重复,替代循环遍历,代码更简洁高效。
  2. 仅在对象有效时添加到列表:等名称验证通过、所有属性初始化完成后,再执行shipObs.add(this),确保只有合法的Ship实例被跟踪。

修改后的构造方法代码:

public Ship(String name, int maxPassengers) {
    // 校验名称唯一性
    if (ships.contains(name)) {
        System.out.println("Ship " + name + " cannot be created because that name already exists");
        return;
    }
    
    // 初始化对象属性
    this.name = name;
    this.maxPassengers = maxPassengers;
    
    // 添加当前对象到静态列表
    ships.add(name);
    shipObs.add(this);
}

额外优化建议

  • 你当前维护两个静态列表(存名称和存对象),其实可以只保留shipObs,校验名称时直接遍历对象列表取名称,避免两个列表的一致性问题:
    // 移除单独的ships列表,从shipObs中校验名称
    if (shipObs.stream().anyMatch(ship -> ship.name.equals(name))) {
        System.out.println("Ship " + name + " cannot be created because that name already exists");
        return;
    }
    
  • 构造方法中直接return会生成一个不完整的Ship实例(比如name为null),更规范的做法是抛出IllegalArgumentException,让调用方明确感知创建失败的原因:
    if (shipObs.stream().anyMatch(ship -> ship.name.equals(name))) {
        throw new IllegalArgumentException("Ship " + name + " cannot be created because that name already exists");
    }
    

内容的提问来源于stack exchange,提问作者Beta Chad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:30:51