[英]How to automatically add an object to a list of another class?
所以我目前正在為我的 Java class 開發一個項目。
這是我的主要內容:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class Main {
public static void main(String args[]){
Entrepot Entrepot1=new Entrepot(3);
Rangee Rangee1=new Rangee(2);
Rangee Rangee2=new Rangee(3);
Rangee Rangee3=new Rangee(3);
/*for(int i=0;i<Entrepot.getNbRangee();i++) {
Entrepot.addRangee(Rangee.getID()==i);
}*/
for(int i=0; i<Entrepot.getNbRangee(); i++) {
Entrepot.addRangee(Rangee.getID());
}
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();
System.out.println(Rangee1.getID());
System.out.println(Rangee2.getID());
System.out.println(Rangee3.getID());
System.out.println(Entrepot.getNbRangee());
System.out.println(Entrepot.getListeRangee());
}
}
每次用戶創建 Object “Rangee”時,我希望它自動添加到 Entrepot class 內的 listeRangee 列表中。
正如你在我的 Main 上看到的,我嘗試了一個 for 循環,它添加了每個 ID 為 i 的 Rangee,但沒有成功。
我對此很陌生,所以如果您能幫助我,我將不勝感激!
謝謝 !
Rangee.java
import java.util.ArrayList;
import java.util.List;
public class Rangee {
private static int count=0;
private static int ID;
private int longueur;
private int largeur=1;
private int hauteur=1;
private int volume= longueur*largeur*hauteur;
private ArrayList<Lot> listeLot= new ArrayList<Lot>();
public Rangee(int longueur) {
this.longueur=longueur;
if(ID<Entrepot.getNbRangee()) {
ID=count++;
}
else {
System.out.println("NON");
}
}
public static int getID() {
return ID;
}
public void setID(int iD) {
if(ID>Entrepot.getNbRangee()) {
System.out.println("Le nombre maximum de rangee est de "+ Entrepot.getNbRangee());
}
ID = iD;
}
Entrepot.java
import java.util.ArrayList;
import java.util.List;
public class Entrepot {
private static int nbRangee;
static ArrayList<Rangee> listeRangee= new ArrayList<Rangee>(nbRangee);
public Entrepot(int nbRangee) {
this.nbRangee=nbRangee;
}
public static boolean addRangee( Rangee newRangee ) {
listeRangee.add(newRangee);
return true;
}
public static int getNbRangee() {
return nbRangee;
}
public void setNbRangee(int nbRangee) {
this.nbRangee = nbRangee;
}
public static ArrayList<Rangee> getListeRangee() {
return listeRangee;
}
public void setListeRangee(ArrayList<Rangee> listeRangee) {
this.listeRangee = listeRangee;
}
}
將Rangee
的構造函數設為私有並公開 static 工廠方法以構建Rangee
的新實例,該實例將自動將其添加到Entrepot
。
public Rangee {
private Rangee(int longueur) {
this.longueur=longueur;
if(ID<Entrepot.getNbRangee()) {
ID=count++;
} else {
System.out.println("NON");
}
}
public static Rangee createRangee(int longueur) {
Rangee rangee = new Rangee(longueur);
Entrepot.listeRangee.add(rangee);
return rangee;
}
您甚至可以在createRangee
方法中移動該檢查 ID 是否低於Entrepot.getNbRangee()
並在發生這種情況時返回 null/throw 錯誤,而不是打印消息。
然后在你的主要方法中:
Rangee rangee1 = Rangee.createRangee(2); // was Rangee Rangee1=new Rangee(2);
Rangee rangee2 = Rangee.createRangee(3); // was Rangee Rangee2=new Rangee(3);
Rangee rangee3 = Rangee.createRangee(3); // was Rangee Rangee3=new Rangee(3);
其他一切都保持不變。
請注意,可以在Entrepot
而不是createRangee
中創建Rangee
,但Rangee
的構造函數必須只能由Entrepot
訪問。 This means: 1/ making the constructor with default access(no public/private) and put both classes in the same package (other classes in the same package can still create Rangee
instances) or 2/ move Rangee
class inside Entrepot
as static class and保持構造函數私有。 綜上所述,這是我在Entrepot
中使用包私有Rangee
構造函數實現它的方式:
class Entrepot {
private int nbRangee;
private List<Rangee> listeRangee = new ArrayList<>(nbRangee);
public Entrepot(int nbRangee) {
this.nbRangee=nbRangee;
}
public int getNbRangee() {
return nbRangee;
}
public void setNbRangee(int nbRangee) {
this.nbRangee = nbRangee;
}
public List<Rangee> getListeRangee() {
return listeRangee;
}
public void setListeRangee(ArrayList<Rangee> listeRangee) {
this.listeRangee = listeRangee;
}
public Rangee createRangee(int longueur) {
if (listeRangee.size() < nbRangee) {
Rangee rangee = new Rangee(longueur);
listeRangee.add(rangee);
return rangee;
} else {
System.out.println("NON");
return null;
}
}
}
請注意,我在這里和那里刪除了一些靜態,因為它們現在更有意義。 請注意,您可以在rangee
的 id 設置為createRangee
listeRangee.size()
。 您之前的實現更新了 static 變量,並且將為您的所有 3 個范圍打印 3
getId()`,我懷疑這不是你想要的。
主要方法是:
class Main {
public static void main(String[] args) {
Entrepot entrepot = new Entrepot(3);
Rangee rangee1 = entrepot.createRangee(2);
Rangee rangee2 = entrepot.createRangee(2);
Rangee rangee3 = entrepot.createRangee(3);
}
}
我想最簡單的方法是間接使用 Rangee 的構造函數作為 Entrepot 的 class 方法。
在 Entrepot class 中,您可以添加它(如果需要,您可以使用參數來完成):
public void createRangee(){
Rangee aux = new Rangee();
listeRangee.add(newRangee);
}
然后在你的主要你不必調用構造函數,而是這個方法:
Entrepot ntrepot1=new Entrepot(3);
entrepot1.createRangee(); // The number of times you need
至於每個人的 id 你可以使用這個解決方案:
私有 static AtomicInteger ID_GENERATOR = new AtomicInteger(1000);
Rangee aux = new Rangee(ID_GENERATOR.getAndIncrement());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.