【问题标题】:How to automatically add an object to a list of another class?如何自动将对象添加到另一个类的列表中?
【发布时间】:2020-12-09 09:46:46
【问题描述】:

所以我目前正在为我的 Java 类开发一个项目。

这是我的主要内容:

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());

    }
}

每当用户创建一个对象“Rangee”时,我希望它自动添加到 Entrepot 类的 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;
    }

}

【问题讨论】:

  • 你至少需要一个 list 的 getter anotherClassInstance.getTheList().add(anObject)
  • 然后将此构造函数设为私有,并创建一个公共工厂方法,该方法在创建 Rangee 后,将其添加到 Entrepot,然后返回。这样,您将不允许在未将其添加到所需列表的情况下创建和实例。
  • 定义“没有成功”。究竟是什么不起作用?

标签: java list add


【解决方案1】:

我想最简单的方法是间接使用 Rangee 的构造函数作为 Entrepot 的类方法。

您可以在 Entrepot 类中添加它(如果需要,您可以使用参数来完成):

        public void createRangee(){
            Rangee aux = new Rangee();
            listeRangee.add(newRangee);
        }

然后在你的 main 你不必调用构造函数,而是这个方法:

Entrepot ntrepot1=new Entrepot(3);
entrepot1.createRangee(); // The number of times you need

至于每个人的 id 你可以使用这个解决方案:

私有静态 AtomicInteger ID_GENERATOR = new AtomicInteger(1000);

Rangee aux = new Rangee(ID_GENERATOR.getAndIncrement());

【讨论】:

    【解决方案2】:

    Rangee 的构造函数设为私有并公开一个静态工厂方法来构建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 错误,而不是打印消息。

    然后在你的 main 方法中:

    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);
    

    其他一切都保持不变。

    注意createRangee 可以在Entrepot 而不是Rangee 中创建,但Rangee 的构造函数必须只能由Entrepot 访问。这意味着:1/ 使构造函数具有默认访问权限(无公共/私有)并将两个类放在同一个包中(同一个包中的其他类仍然可以创建 Rangee 实例)或 2/ 将 Rangee 类移入 @ 987654335@ 作为静态类并保持构造函数私有。说了这么多,下面是我在 Entrepot 中使用 package-private 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;
            }
        }
    }
    

    请注意,我在这里和那里删除了一些静态,因为它们现在更有意义。请注意,您可以在createRangee 中将rangee 的ID 设置为listeRangee.size()。您之前的实现更新了一个静态变量,并且会为您的所有 3 个 rangees getId()` 打印 3,我怀疑这不是您想要的。

    主要方法是:

    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      • 1970-01-01
      • 2021-12-10
      相关资源
      最近更新 更多