Java初始化阶段将创建的对象存入ArrayList的问题
解决Ship对象存入静态ArrayList的问题
你的思路是对的,在构造方法中添加shipObs.add(this)就能实现对象跟踪,但问题出在添加的时机不对,以及当前的名称校验逻辑可以优化。
问题分析
你当前的构造方法中,如果检测到名称重复会直接return,但此时如果shipObs.add(this)放在错误位置,要么会把未完成初始化的无效Ship实例加入列表,要么根本没执行到添加逻辑,导致看似“无法生效”。
修正方案
- 简化名称校验逻辑:用
ships.contains(name)直接判断名称是否重复,替代循环遍历,代码更简洁高效。 - 仅在对象有效时添加到列表:等名称验证通过、所有属性初始化完成后,再执行
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
相关产品推荐
相关产品推荐

