如何自动将Rangee对象添加至Entrepot类的listeRangee列表?
解决自动将Rangee对象添加到Entrepot列表的问题
你想要实现每次创建Rangee实例时自动将其加入Entrepot的listeRangee列表,但当前代码存在几个关键逻辑错误导致需求失效,我来帮你逐个修正:
核心问题分析
- Rangee的static ID变量误用:你把
ID声明为static,这意味着所有Rangee对象会共享同一个ID值,完全无法区分不同实例,这是致命问题。 - 自动添加的逻辑位置错误:你试图在Main里用循环手动添加,但正确的做法应该是在Rangee的构造方法里完成自动添加,这样每次创建对象时都会触发逻辑。
- Entrepot的static成员设计不合理:
nbRangee和listeRangee都是static,会导致所有Entrepot实例共享同一个仓库列表和容量,通常我们需要每个仓库是独立的实例。 - 构造方法里的ID生成逻辑混乱:原有的count自增和ID赋值逻辑无法生成唯一的实例ID,且volume的计算时机错误(初始化时longueur还未赋值,会得到0)。
修正后的代码
1. 修正Entrepot.java(改为实例成员,实现独立仓库管理)
import java.util.ArrayList; public class Entrepot { private int nbRangee; // 改为实例变量,每个仓库独立管理容量 private ArrayList<Rangee> listeRangee = new ArrayList<>(); // 实例变量,每个仓库有专属列表 public Entrepot(int nbRangee) { this.nbRangee = nbRangee; } // 添加Rangee前先检查容量 public boolean addRangee(Rangee newRangee) { if (listeRangee.size() < nbRangee) { listeRangee.add(newRangee); return true; } else { System.out.println("无法添加新Rangee:仓库容量已达上限(" + nbRangee + "个)"); return false; } } // 非static的getter/setter,对应实例属性 public int getNbRangee() { return nbRangee; } public void setNbRangee(int nbRangee) { this.nbRangee = nbRangee; } public ArrayList<Rangee> getListeRangee() { return listeRangee; } public void setListeRangee(ArrayList<Rangee> listeRangee) { this.listeRangee = listeRangee; } }
2. 修正Rangee.java(修复ID逻辑,构造时自动添加到仓库)
import java.util.ArrayList; public class Rangee { private static int count = 0; // static计数器,用于生成唯一ID private int id; // 实例变量,每个Rangee拥有独立ID private int longueur; private int largeur = 1; private int hauteur = 1; private int volume; private ArrayList<Lot> listeLot = new ArrayList<>(); // 构造方法接收Entrepot实例,创建时自动完成添加 public Rangee(int longueur, Entrepot entrepot) { this.longueur = longueur; this.id = ++count; // 先自增计数器,再赋值ID,确保唯一且从1开始 this.volume = longueur * largeur * hauteur; // 构造时计算体积,避免初始值为0 // 自动将当前Rangee实例加入仓库列表 entrepot.addRangee(this); } // 非static的getter,对应实例ID public int getId() { return id; } // 按需添加其他getter/setter public int getLongueur() { return longueur; } public void setLongueur(int longueur) { this.longueur = longueur; this.volume = longueur * largeur * hauteur; // 修改长度后重新计算体积 } }
3. 修正Main.java(移除错误循环,传入仓库实例创建Rangee)
public class Main { public static void main(String args[]) { Entrepot entrepot1 = new Entrepot(3); // 创建容量为3的仓库 // 创建Rangee时传入仓库实例,自动完成添加 Rangee rangee1 = new Rangee(2, entrepot1); Rangee rangee2 = new Rangee(3, entrepot1); Rangee rangee3 = new Rangee(3, entrepot1); // 测试超过容量的情况 Rangee rangee4 = new Rangee(4, entrepot1); // 会打印容量不足提示 // 原有Meuble相关代码保留(假设Meuble、Lot等类逻辑正常) Meuble meuble = new Meuble("Table", new Lot[]{new Lot(new Vis(200,10),1), new Lot(new Planche(1000,500),3)}, "Salon",3); meuble.afficherMeuble(); // 打印每个Rangee的独立ID System.out.println(rangee1.getId()); System.out.println(rangee2.getId()); System.out.println(rangee3.getId()); // 打印仓库的Rangee数量和列表 System.out.println("仓库中的Rangee数量:" + entrepot1.getListeRangee().size()); System.out.println("仓库中的Rangee列表:" + entrepot1.getListeRangee()); } }
修正后的逻辑说明
- 独立仓库管理:每个Entrepot实例有自己的容量和Rangee列表,避免了static导致的全局共享问题。
- 唯一实例ID:用static计数器生成每个Rangee的唯一ID,确保每个实例的ID不重复。
- 自动添加触发:在Rangee的构造方法里调用仓库的
addRangee方法,每次创建对象时自动完成添加,无需手动循环。 - 容量校验:添加前检查仓库是否已满,避免超出设定的容量限制。
内容的提问来源于stack exchange,提问作者Kopraan
相关产品推荐
相关产品推荐

