2010-08-04 11 views
7

Estudié Java es pasar referencia de objeto por valor, y para hacer una copia local de un objeto, puedo hacer clone() o copy-constructor. También miré copia profunda/superficial y varias publicaciones en stackoverflow.¿Cómo hacer una copia del objeto ArrayList que es tipo de lista?

Ahora estoy mirando ejemplo:

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

Pocos artículos que leí sólo menciona que ArrayList implementa cloneable pero en realidad no dice cómo hacer una copia local de "lista" no si el tipo es Lista arrayList cuales no implementa clonable.

Puedo llamar a clone() si "list" es el tipo de ArrayList.

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

Pero si el tipo es Lista, no puedo.

¿Debo usar el constructor de copias como a continuación para hacer una copia local? ¿Cuál es la mejor manera de hacer una copia de "lista"?

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

Respuesta

5

Pasar la lista al constructor es probablemente la mejor manera de hacerlo. La invocación de constructor usará, entre bastidores, System.arraycopy. Por lo tanto, desconectará efectivamente la copia local de la lista pasada a través del constructor.

0

Utilice el constructor de copia cada vez que pueda. clone() es obsoleto y no se debe utilizar (ni implementar) en un código nuevo.

Si extiende una clase que implementa Cloneable, que tienen más remedio que poner en práctica un método de clone de buen comportamiento. De lo contrario, es mejor que proporcione un medio alternativo de copia de objetos , o simplemente no proporciona la capacidad. [...] Un buen enfoque para copiar objetos es proporcionar un copia constructor o copiar fábrica. [...]

Teniendo en cuenta todos los problemas asociados con Cloneable, es seguro decir que otros interfaces no deben extenderse, y que las clases diseñadas para la herencia (artículo 17) no deben ponerlo en práctica. Debido a sus muchas deficiencias, algunos programadores expertos de simplemente eligen nunca anular el método clone y nunca para invocarlo, excepto, tal vez, para copiar matrices.

De Effective Java 2nd Edition, artículo 11.

+0

No lo entiendo. ¿Cuáles son todos los "problemas asociados con Cloneable" y por qué son tan malos que nunca debería invocarlos? –

+1

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

0

Parece por pregunta que usted desea hacer su colección sin modificar para que pueda utilizar Collections.unmodifiableList().

Cuestiones relacionadas