繁体   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