簡體   English   中英

如何自動將 object 添加到另一個 class 的列表中?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM