Мелкая копия объекта не корректно обновляет исходный объект - PullRequest
0 голосов
/ 04 ноября 2019

Я хотел бы смоделировать график и сделать это:

  • У меня есть класс A, который содержит LinkedList экземпляров A и имеет связанный метод установки:
class A {
    private LinkedList<A> list;
    [...]
    public setList(LinkedList<A> l) {
        this.list = l;
    }
}
  • И в другом классе NetA у меня есть метод genCon, который принимает LinkedList экземпляров A, а затем устанавливает их атрибут списка как перетасованный подсписок rlist:
static void genCon (LinkedList<A> rlist) {
    for(int i=0; i<rlist.size(); i++) {
        A temp = rlist.get(i);
        LinkedList<A> slist = new LinkedList<A>(rlist.subList(0, rlist.size()));
        temp.setList(slist);
    }
}

Затем вызывается genCon (rlist) в main, но, хотя все объекты rlist должны иметь инициализированный список (равный перетасованной версии rlist), некоторые выглядят пустыми, без какого-либо согласованного шаблона (т.е. некаждый n или повторяющийся шаблон), но совершенно случайно.

Сначала я подумал, что A temp = rlist.get(i) не дает мне мелкую копию объекта с индексом i, но проверка на идентичность с == возвращаетправда, поэтому, если я не ошибаюсь, это означает, что обе переменные содержат одну и ту же ссылку, и это не должно быть причиной проблемы? Тогда я подумал, что это может быть проблемой оптимизации, может быть, eclispe пытается выполнять операции параллельно, и это как-то портит инициализацию случайным образом? Я попытался обработать шаг за шагом, но я не могу найти, где я испортил. Что я пропустил?

Редактировать:

Основная функция выглядит так:

public static void main(String[] args) {
    LinkedList<A> a_list = generateAList(20);
    genCon(a_list);

    for(int i=0; i<a_list.size(); i++) {
        System.out.println(a_list.get(i).toString());
    }
}

a_list правильно инициализирован. Проблема возникает в следующем цикле при попытке печати объектов. Поскольку он предназначен только для тестирования, main находится в том же классе, что и at genCon ().

generateAList () выглядит следующим образом:

static public LinkedList<A> generateAList(int n) {
    LinkedList<A> a_list = new LinkedList<A>();

    for(int i=0; i<n; i++) {
        ap_list.add(A.rand()); // A.rand() is just a static function that return an instance of A with randomly set values and an unitialized list.
    }

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