2011-08-30 8 views
6

Para realizar una copia de un objeto y obtener acceso a sus datos, ¿qué es mejor y por qué?Clonación de objetos

1. Crear un nuevo objeto e inicializar con los datos que desea clon a través del constructor

HashSet<String> myClone = new HashSet<String>(data); 

2. objeto Clonar como está y echarlo a los del tipo que cree que es ser

HashSet<String> myClone = (HashSet<String>) data.clone(); 
+2

Posible duplicado de http://stackoverflow.com/questions/2356809/shallow-copy-of-a-map-in-java –

+2

@Mansoor tiene razón: el constructor de copias es definitivamente el camino a seguir. – mre

+0

@mre: el uso de un constructor de copia significa directamente que el nuevo objeto será un objeto del tipo especificado, en lugar de un objeto cuyo tipo coincida con el objeto que se está copiando. En algunos casos, esto puede ser muy malo. Llamar al constructor de copia del Vehículo en un ToyotaPrius producirá un Vehículo con propiedades relacionadas con el vehículo que coincidan con las del ToyotaPrius copiado, pero cualquier información específica de Toyota-Prius en el vehículo original se omitirá en la copia. Tal semántica puede ocasionalmente ser deseada, pero a menudo lo que se desearía sería un ToyotaPrius cuyas propiedades coincidieran con el original. – supercat

Respuesta

2

Definitivamente uso un constructor de copia - clone() está bastante roto (al menos la mayoría de la gente lo acepta). Ver here para más detalles.

0

Clon no copia los datos, copiar las referencias (Shallow copy). Por lo tanto, si desea hacer una "copia" profunda y que se independizó de la primera, tendrá que hacer una "clonación elemento por elemento", comúnmente referida como deep copy (hay varios métodos para lograr esto).

Además, puede echar un vistazo al método clone() de la clase que implementa ese HashSet. Si esa clase ha anulado ese método, entonces podría realizar una copia profunda. Te recomiendo este libro: http://www.horstmann.com/corejava.html

1

'Depende'. No todas las clases tienen constructores de copia. Algunas clases definen clone() y otras lo heredan de Object.

Si está pensando en cómo implementar la semántica de copia en su propia clase, muchas personas recomiendan no copiar, pero otros lo recomiendan. Una tercera alternativa es un método de fábrica estático que hace el trabajo.

Si está tratando de hacer una copia de alguna clase existente, está a merced de la implementación existente. Tal vez tiene un clone() que hace lo que quiere, y tal vez no. Tal vez tiene un constructor de copia, tal vez no.