Как мне скопировать arraylist из одного класса в другой в Java? - PullRequest
0 голосов
/ 05 февраля 2010

Я понимаю, что для того, чтобы скопировать массив и иметь два списка, независимых друг от друга, вы должны использовать глубокую копию (копирование объектов из одного списка в другой, а не только ссылки), однако есть ли способ сделать это кросс-класс?

Например; Я звоню Class2 от Class1. В Class2 объекты добавляются в ArrayList пользовательских объектов после события. Я хотел бы иметь возможность перенести этот ArrayList в Class1, но всякий раз, когда я пытаюсь, я получаю NullPointer.

Любые подсказки ??

Ответы [ 2 ]

1 голос
/ 05 февраля 2010

Это очень показательный недостаток дизайна.

Проверьте, не можете ли вы достичь той же цели, заключив свой список в класс, поделившись с ним классом и используя его для управления доступом к списку.

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

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

Либо тот, либо класс-обертка могут содержать второй список, и при запросе возвращать объединенные результаты исходного и второго списков.

Я почти никогда не хотел глубокую копию. Такое бывает, но это довольно редко.

Если вы опубликуете больше информации, возможно, мы сможем более конкретно помочь с редизайном.

ТАКЖЕ: (Изменить) Скорее всего, список скопированных массивов не является вашей проблемой - скорее всего, он не был ИСТИННО глубокой копией. Для глубокой копии это означает, что вы реализуете метод копирования (я полагаю, что они должны называться .clone (), я никогда не использую этот материал - как я уже сказал, это плохо для juju) для каждого объекта в списке массивов, затем Вы вызываете свой метод копирования для каждого, чтобы получить новую копию в вашем следующем списке.

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

Я предполагаю, что вы где-то не в процессе.

Мне бы очень хотелось услышать, почему вы считаете, что вам нужна копия, а не ссылка.

0 голосов
/ 05 февраля 2010

Я предлагаю вам создать метод getArray () и вызвать его из другого класса. Этот метод должен создать копию ArrayList, потому что вы не должны «передавать» переменные внутри классов; всегда с методом get (), поэтому парадигма ОО остается неизменной.

Сделайте что-то вроде этого:

Класс 1

public ArrayList<Object> getArray() {
   ArrayList<Object> aux = new ArrayList<Object>();
    for(Object x : list) //object is the string, int, etc...
        aux.add(x.clone()) //assuming the Object has a clone method!
    return aux;
   }

В классе 2 просто вызовите этот метод. Тогда просто посмотрите на тест из другого ответа о нулевом исключении, должно сработать. Надеюсь, это поможет.

...