Как работает ссылка на объект и клонирование в Java - PullRequest
2 голосов
/ 21 января 2010

Ниже приведен код

ArrayList arList = someMethod();// returning ArrayList with customDO objects

Теперь где-то в другом классе я получаю данные из этого arList

CustomDo custDO= (CustomDO)arList.get(0);

Будет ли arList живым, пока жив custDO? Если да, поможет ли фрагмент кода ниже

CustomDO custDO = ((CustomDO)arList.get(0)).cloneMe();
// where cloneMe has defintion as return ((CustomDO)super.clone());
// CustomDo implements Cloneable

Есть ли лучший способ сохранить копию только первого элемента arList и удалить список, чтобы его мог собрать сборщик мусора?

Ответы [ 4 ]

3 голосов
/ 21 января 2010

Есть ли лучше сохранить копию только первого элемента arList и отбросить список, чтобы его мог собрать сборщик мусора?

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

В Java нет необходимости что-либо клонировать, чтобы убедиться, что объект не исчезает. В Java ссылка на объект всегда действительна. Не может быть так, что данные для активной ссылки становятся недействительными.

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

0 голосов
/ 21 января 2010

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

0 голосов
/ 21 января 2010

Пока у вас есть доступ к CustomDO custDO объекту, он не будет собирать мусор. Список можно собирать, если на него нет ссылок.

0 голосов
/ 21 января 2010
// reference to first object
CustomDO custDO = ((CustomDO)arList.get(0));
// let arList be garbage collected
arList = null;

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

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