Как предотвратить копирование объектов в 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.