Как я могу сохранить копию элемента в массиве? - PullRequest
1 голос
/ 20 февраля 2012

В настоящее время у меня есть ArrayList<Waypoint>, где Waypoint - это простой класс, который используется для представления позиции в x / y-сетке. Теперь я заметил, что для одного метода я всегда использую один и тот же экземпляр объекта Waypoint - но я продолжаю изменять его значения.

Итак, если мы скажем Waypoint WP, который инициализирован как X = 0, Y = 0, и я добавлю это к ArrayList, что именно будет сохранено? Элемент WP или просто копия, содержащая его значения? Или, по-другому, если бы я теперь увеличивал значения WP и сохранял бы его в ArrayList, элементы в позициях 0 и 1 в ArrayList были бы точно такими же?

Если да, есть ли "простой" способ создать и сохранить копию элемента Waypoint без необходимости каждый раз создавать новый instance?

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 20 февраля 2012

Java работает по ссылкам, поэтому объект Waypoint, если он явно не клонирован, будет таким же.

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

Это покажет нужное вам поведение:

static class Pair
{
    int x,y;

    public Pair(int x, int y) { this.x = x; this.y = y; }
}

public static void main(String[] args)
{
    java.util.ArrayList<Pair> pairs = new java.util.ArrayList<Pair>();
    Pair p = new Pair(0,0);
    pairs.add(p);
    p.x = 20; p.y = 40;
    System.out.println(pairs.get(0).x+" "+pairs.get(0).y);
}

Вы увидите, что вывод равен "20 40" каквы ожидаете.

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

Выполнение

list.add(p);
// modify p
list.add(p);

просто вставит один и тот же элемент дважды, а это не то, что вы ищете.Вместо этого:

 list.add(p);
 Waypoint p2 = p.duplicate();
 list.add(p2);

вставит два разных объекта (при условии, что duplicate фактически создает другой объект с new)

0 голосов
/ 20 февраля 2012

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

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

Что касается вашего вопроса, «копия» по определению является новым экземпляром, в противном случае она не была бы истинной копией.

0 голосов
/ 20 февраля 2012

Из информации, которой вы поделились, ответ - да. Вы добавляете один и тот же экземпляр в массив дважды.

Самый простой способ скопировать объект - это определить конструктор, который принимает оригинал в качестве аргумента и копирует необходимые элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...