2010-08-04 2 views
7

Я изучил Java, передавая ссылку на объект по значению, и для создания локальной копии объекта я могу либо сделать clone(), либо copy-constructor. Я также посмотрел на глубокую/мелкую копию, а также на несколько сообщений в stackoverflow.Как сделать копию объекта ArrayList, который является типом списка?

Теперь я смотрю на пример:

List<String> list = new ArrayList<String>(); 
String one = "one" 
list.add(one); 

Несколько статей я читал только упоминает, что ArrayList реализует клонируемыми, но на самом деле не сказать, как сделать локальную копию «списка», если тип списка не ArrayList, который не выполняет клонирование.

Я могу вызвать clone(), если «list» - это тип ArrayList.

ArrayList<String> list = new ArrayList<String(); 
list.clone(); 

Но если тип - это список, я не могу.

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

List<String> tmpList = new ArrayList<String>(list); 

ответ

5

Передача списка в конструктор, вероятно, является лучшим способом. Сам вызов конструктора будет использовать за кулисами System.arraycopy. Таким образом, он эффективно отделяет локальную копию от списка, переданного через конструктор.

0

Используйте конструктор копирования, когда можете. clone() является устаревшим и не должен использоваться (не реализован) в новом коде.

Если вы расширяете класс, который реализует Cloneable, у вас есть небольшой выбор, но реализовать хорошо себя clone метод. В противном случае, вам лучше предоставить альтернативные средства для копирования объектов или просто не предоставлять возможности. [...] Прекрасным подходом к копированию объектов является предоставление конструктора копии или копировальный завод. [...]

Учитывая все проблемы, связанные с Cloneable, можно с уверенностью сказать, что другие интерфейсы не должны распространяться, и что классы, предназначенные для наследования (пункт 17), не должны его реализовать. Из-за своих многочисленных недостатков некоторые программисты-программисты просто выбирают никогда не переопределять метод clone и никогда не , чтобы вызвать его, за исключением, возможно, копирования массивов.

От Effective Java 2nd Edition, Пункт 11.

+0

Я не понимаю. Каковы все «проблемы, связанные с клонированием», и почему они настолько плохи, что вы никогда не должны их игнорировать? –

+1

@ RussellSilva, http://jtechies.blogspot.hu/2012/07/item-11-override-clone-judiciously.html –

0

Похоже на вопрос, который вы хотите, чтобы ваша коллекция неизмененной, так что вы можете использовать Collections.unmodifiableList().

Смежные вопросы