Как предотвратить копирование объектов в arraylIst в Java

У меня есть 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 ответа

Решение

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

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

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

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

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

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

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

Вы создаете новый объект каждый раз 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));

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

Если вы видите ваш второй экземпляр с неправильными значениями, то вы либо

  • добавил не тот объект или
  • посмотрел не на то место / индекс (в списке)

Это:

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.

Другие вопросы по тегам