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