Как предотвратить копирование объектов в arraylIst в Java - PullRequest
0 голосов
/ 15 марта 2012

У меня есть arrayList объекта Player. У игрока есть идентификатор поля и счет. Предположим, что arrayList имеет player object with id:1, score:200 теперь, когда я добавляю player with id:1 and score :300, у arraylist теперь есть два объекта, но оба со счетом 200. Тогда как это должен быть один со счетом 100 и один со счетом. Я попробовал метод clone () как arrayList.add(player.clone()), но он не решил мою проблему.

Код:

Player player= playerService.getPlayerById(id);
player.SetScore(100);
challenge.getPlayerList().add(player.clone());
here challenge is an object which has an attribute playerlist

Пожалуйста, предложите. Спасибо.

Ответы [ 4 ]

4 голосов
/ 15 марта 2012

Распространенной ошибкой является предположение, что добавление объекта в список / массив копирует его.

Если правда, вы добавляете ссылки на коллекцию, а не объект, и это ссылка, которая копируется .

Вы создаете новый объект каждый раз, когда вызывается только new или clone().

// Don't do this
Player p = new Player(1, 100);
list.add(p);
list.add(p); // adds a reference to the same object.

// Do this
list.add(new Player(1, 100));
list.add(new Player(2, 200));
1 голос
/ 15 марта 2012

Если вы добавите два экземпляра Player в список, то список будет содержать оба элемента, даже если два экземпляра являются одним и тем же объектом.тогда вы либо

  • добавили неправильный объект, либо
  • посмотрели на неправильное место / индекс (в списке)
0 голосов
/ 15 марта 2012

Это:

Player player= playerService.getPlayerById(id);
player.SetScore(100);
challenge.getPlayerList().add(player.clone());

Как вы уже поняли, в список добавляются два повторяющихся элемента.Если я читаю ваш вопрос правильно, вы действительно хотите сделать что-то вроде:

Player player= playerService.getPlayerById(id);
Player clone = (Player)player.clone();
clone.SetScore(100);
challenge.getPlayerList().add(clone);

Это только устанавливает счет нового игрока, но не обоих.Так что теперь у вас будет список с игроком с исходным счетом и игроком с результатом 100.

0 голосов
/ 15 марта 2012

Если вы не показываете некоторый код, я предполагаю, что вы добавляете тот же объект Player, но с другими значениями. Если вы:

  • Добавить игрока с id: 1 и счетом: 100
  • Изменить значения этого объекта Player на счет: 200
  • Добавить этот объект снова

В вашем списке будет 2 игрока с последними значениями объекта Player.

Где-то вам нужно сделать new Player() с новыми значениями, а не просто повторно использовать тот же объект Player.

Прочтите эту статью о вызове по ссылке, по запросу: http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

...