Наличие разных ArrayLists для объектов классов в Java - PullRequest
0 голосов
/ 21 ноября 2011

У меня есть класс, и у этого класса есть один открытый элемент ArrayList myList. (У меня есть и другие элементы в моем классе, но они не имеют ничего общего с этим элементом)

Я пытаюсь создать разные списки массивов для разных объектов класса. Однако, когда я пытался закодировать это, даже если я использую разные объекты класса, код резервирует каждую запись в одном ArrayList. Что я делаю не так?

Вот что я попробовал: Мой класс:

public class myClass {

public static ArrayList myList;
public static ArrayList getList() {
    return myList;
}
public static void setList(ArrayList myList) {
    myClass.myList = myList;
}

В основном:

 myClass my = new myClass();
 myClass my2 = new myClass();
 ArrayList tmp = new ArrayList();
 ArrayList tmp2 = new ArrayList();
 tmp.add("aaaaa");
 tmp.add("bbbbb");
 tmp2.add("ccccc");
 tmp2.add("ddddd");
 my.setList(tmp);
 my2.setList(tmp2);
 for(int i=0;i<my.getList().size();i++)
 {
 System.out.println(my.getList().get(i));
 }

И вывод этой магистрали таков:

ccccc
ddddd

но я хочу, чтобы это было:

aaaaa
bbbbb

Что я делаю не так?

Ответы [ 4 ]

3 голосов
/ 21 ноября 2011

Вы объявили myClass # myList статическим, что означает, что в классе CLASS myClass будет существовать только один экземпляр myList. Объявите его нестатичным, включая getter и setter, чтобы иметь разные экземпляры для my и my2, и вы готовы к работе.

0 голосов
/ 21 ноября 2011

Как указано в других комментариях, вы объявляете ArrayList как static , что означает, что он используется для всех объектов экземпляров класса - как такой в ​​следующем заявлении:

my.setList(tmp);
my2.setList(tmp2);

... второй setList перезаписывает первый.

Прочтите образец Singleton для хорошего примера использования статических полей:

Синглтон

Кроме того, рассмотрите возможность передачи ваших значений в конструктор и предоставления только получателя, таким образом инкапсулируя использование ArrayList и делая значения неизменяемыми - например:

myClass my = new myClass("aaaa", "bbbb");
String element = my.get(0);

Наконец, если вы используете Java 5 или 6, подумайте об использовании Generics при работе с коллекциями / списками:

List<String> tmp = new ArrayList<String>();

Надеюсь, это поможет.

0 голосов
/ 21 ноября 2011

Измените ваш класс следующим образом

public class myClass {

    public ArrayList myList;
    public ArrayList getList() {
    return myList;
}
public void setList(ArrayList myList) {
    listler.myList = myList;
}

Вы используете static ArrayList myList, который является общим для всех объектов вашего класса myClass.Следовательно, вы не получаете то, что ожидаете.Избегайте использования static, если вам нужно использовать ArrayList myList отдельно для всех объектов класса.


Java позволяет вам получить доступ к статическим членам класса как с его объектами, так и сассоциирование их с именем класса, но плохая практика - связывать статические члены с объектами класса.


Связывание самих статических членов с объектом класса на самом деле является недостатком в самой языковой структуре (следовательно, должно бытьизбегать доступа к ним с помощью объектов), что было исправлено в C #, и, следовательно, в C # нельзя связывать статические члены с соответствующими объектами класса.


В Java некоторые IDE могут выдавать предупреждения или ошибки, если вы попытаетесьдля доступа к статическим членам с соответствующими объектами класса.

0 голосов
/ 21 ноября 2011

вы используете статические в вашем классе.

удалите статическое ключевое слово для переменной в вашем классе, и все будет в порядке.Static - это область действия класса, поэтому она будет использоваться всеми объектами.

...