Как автоматически добавить объект в список другого класса?

#java #list #add

#java #Список #Добавить

Вопрос:

Итак, в настоящее время я работаю над проектом для своего класса 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», я хочу, чтобы он автоматически добавлялся в список listeRangee внутри класса Entrepot.

Как вы можете видеть на моем основном, я попробовал цикл for, в котором он добавляет каждый Rangee с идентификатором i, но это не сработало.

Я новичок в этом, поэтому буду очень признателен, если вы сможете мне помочь!

Спасибо!

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

}
 

Комментарии:

1. вам нужен геттер для списка , по крайней мере : anotherClassInstance.getTheList().add(anObject)

2. Затем сделайте этот конструктор закрытым и создайте общедоступный фабричный метод, который после создания Rangee добавляет его в Entrepot, а затем возвращает его. Таким образом, вы не разрешите создавать и создавать экземпляры, не добавляя их в нужный список.

3. Определите «это не сработало». Что именно не сработало?

Ответ №1:

Самый простой способ, который я себе представляю, сделать это — использовать конструктор Rangee косвенно как метод класса Entrepot .

Внутри класса Entrepot вы можете добавить это (вы можете сделать это с параметрами, если вам нужно):

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

Тогда в вашем основном вам не нужно было бы вызывать конструктор, а вместо этого этот метод:

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

Что касается идентификатора каждого, вы могли бы использовать это решение:

частный статический атомарный элемент ID_GENERATOR = новый атомарный элемент (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;
  }
 

Вы даже можете переместить эту проверку, если ID меньше, чем Entrepot.getNbRangee() внутри createRangee метода, и вернуть ошибку 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);
 

Все остальное остается прежним.

Обратите внимание, что это createRangee может быть создано Entrepot вместо Rangee , но Rangee конструктор должен быть доступен только для Entrepot . Это означает: 1 / создание конструктора с доступом по умолчанию (без общедоступного / частного) и помещение обоих классов в один и тот же пакет (другие классы в том же пакете все еще могут создавать Rangee экземпляры) или 2 / перемещение Rangee класса внутрь Entrepot как статического класса и сохранение конструктора закрытым. Учитывая все сказанное, вот как я бы реализовал это 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;
        }
    }
}
 

Обратите внимание, что я удалил несколько статических элементов здесь и там, поскольку теперь они имеют больше смысла. Обратите внимание, что вы можете установить идентификатор rangee ‘s на listeRangee.size() inside createRangee . Ваша предыдущая реализация обновила статическую переменную и напечатала бы 3 для всех ваших 3 rangees 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);
    }
}