Java ссылки ArrayList - PullRequest
       41

Java ссылки ArrayList

0 голосов
/ 19 октября 2011

У меня есть ArrayList, к которому я добавляю объекты.Объекты добавляются с помощью текстового поля.

У меня проблема в том, что когда пользователь вводит значение в текстовое поле, все записи в моем ArrayList принимают новое значение.

if(e.getSource() == textbox){
        String name = textbox.getText();            
        NameSurferEntry entry = new NameSurferEntry();
        entry = db.findEntry(name);
        graph.addEntry(entry);
        graph.update();
        textbox.setText("");

    }

Код для добавления записи:

public void addEntry(NameSurferEntry entry) {       
    entryArray.add(entry);          
    }

Ответы [ 3 ]

1 голос
/ 19 октября 2011

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

NameSurferEntry entry = new NameSurferEntry();
entry = db.findEntry(name);

То, что вы должны учитывать, - это попытаться достичь неизменности в ваших объектах и ​​/ или выполнить защитное копирование .Для простых свойств достаточно объявить их final, но для сложных элементов обычно требуется скопировать объект, создав его заново.

Следующий пример должен работать для вас, учитывая, что вы реализуете конструктор копирования

NameSurferEntry copy = new NameSurferEntry(db.findEntry(name));
0 голосов
/ 19 октября 2011

Что бы это ни было:

entry = db.findEntry(name);

содержит и возвращает один объект, и вы меняете все, что в нем содержится.

Для большей ясности: вы снова и снова добавляете одну и ту же ссылку в свой список и изменяете содержимое одного объекта, на который указывает ссылка.

0 голосов
/ 19 октября 2011

Это означает, что db.findEntry всегда возвращает один и тот же экземпляр NameSurferEntry и просто заменяет имя внутри него на имя, которое он получает в качестве аргумента.

Добавление объекта в список только добавляет ссылку на объект в списке. Он не клонирует объект, чтобы сохранить его копию в списке.

Кстати, почему вы создаете new NameSurferEntry и присваиваете его переменной ввода, если это просто перезаписать его результатом db.findEntry впоследствии?

...