Java中Basket类如何切换使用不同参数的构造方法?
解决Basket类添加鱼后切换状态的问题
嘿,这个问题的核心其实是怎么让Basket对象在添加鱼后,从单鱼状态平滑切换到多鱼状态,不再沿用第一个构造方法对应的逻辑对吧?咱们来一步步搞定它:
第一步:完善Basket类的成员变量
你原来的代码只标记了singleFish布尔值,但没有实际存储鱼的实例,这是最大的问题。咱们得先给类加上合适的存储结构,推荐用List<Fish>来动态存储鱼(比数组灵活太多),同时保留必要的状态标记:
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Basket { private boolean singleFish; // 标记当前是否为单鱼状态 private Fish singleFishInstance; // 单鱼状态下存储的鱼 private List<Fish> fishList; // 统一存储所有鱼的集合,不管单/多 private int weightLimit; // 篮子的重量限制 // 单鱼构造方法:初始化时存入一条鱼,并标记为单鱼状态 public Basket(int weightLimit, Fish fish) { this.weightLimit = weightLimit; this.singleFish = true; this.singleFishInstance = fish; // 初始化集合,把单鱼也加进去,方便后续添加 this.fishList = new ArrayList<>(); fishList.add(fish); } // 多鱼构造方法:初始化时存入鱼数组,标记为非单鱼状态 public Basket(int weightLimit, Fish[] fishes) { this.weightLimit = weightLimit; this.singleFish = false; this.singleFishInstance = null; // 把数组转成集合存储 this.fishList = new ArrayList<>(Arrays.asList(fishes)); } }
第二步:实现addFishes方法的状态切换逻辑
在添加鱼的时候,我们只需要做几件关键的事:把新鱼加入集合、切换状态为非单鱼、清空单鱼引用(避免状态混淆)。如果需要判断重量是否超标,也可以在这里加逻辑:
public boolean addFishes(Fish fish) { // 可选:判断添加后是否超过重量限制(假设Fish有getWeight()方法) // int currentTotalWeight = fishList.stream().mapToInt(Fish::getWeight).sum(); // if (currentTotalWeight + fish.getWeight() > weightLimit) { // return false; // 重量超标,添加失败 // } // 添加新鱼到集合 fishList.add(fish); // 切换为多鱼状态,之后所有逻辑都基于集合处理 this.singleFish = false; // 清空单鱼引用,避免后续误判 this.singleFishInstance = null; return true; }
第三步:同步依赖状态的方法(可选)
如果你的代码里有依赖singleFish状态的方法(比如获取鱼的方法),也要同步修改,保证状态一致性:
// 获取所有鱼的列表(返回副本,避免外部修改内部集合) public List<Fish> getAllFishes() { return new ArrayList<>(fishList); } // 仅在单鱼状态下能获取单条鱼,否则抛出异常 public Fish getSingleFish() { if (singleFish) { return singleFishInstance; } throw new IllegalStateException("当前篮子包含多条鱼,无法获取单条鱼"); }
这样一来,当初始用单鱼构造方法创建的Basket对象,只要调用一次addFishes,就会彻底切换到多鱼状态,后续再也不会使用第一个构造方法对应的单鱼逻辑了~
内容的提问来源于stack exchange,提问作者David Hermanto
相关产品推荐
相关产品推荐

