Todos los enfoques para copiar objetos en Java tienen defectos graves:
Clon
- El método clone() está protegido, por lo que no se puede llamar directamente a no ser que la clase de las anulaciones de interrogación con un método público.
- clone() no llama al constructor. Cualquier constructor. Asignará memoria, asignará el campo interno
class
(que puede leer a través del getClass()
) y copiará los campos del original.
Para más problemas con clone(): véase el punto 11 del libro de Joshua Bloch "Effective Java, Second Edition"
Serialize
Serialize es aún peor; tiene muchos de los defectos de clone()
y algo más. Joshua tiene un capítulo completo con cuatro elementos solo para este tema.
mi solución
Mi solución es añadir una nueva interfaz para mis proyectos:
public interface Copyable<T> {
T copy();
T createForCopy();
void copyTo (T dest);
}
El código es el siguiente:
class Demo implements Copyable<Demo> {
public Demo copy() {
Demo copy = createForCopy();
copyTo (copy);
return copy;
}
public Demo createForCopy() {
return new Demo();
}
public void copyTo (Demo dest)
super.copyTo (dest);
...copy fields of Demo here...
}
}
Por desgracia, tengo que copiar este código para todos mis objetos, pero siempre es el mismo código, por lo que puedo usar una plantilla de editor de Eclipse. Ventajas:
- Puedo decidir qué constructor llamar y cómo inicializar qué campo.
- inicialización sucede en un orden determinista (clase raíz de la clase ejemplo)
- puedo reutilizar objetos existentes y sobrescribir
- Tipo seguras
- Singleton estancia únicos
Para los tipos estándar de Java (como colecciones, etc.), utilizo una clase de utilidad que puede copiarlos. Los métodos tienen indicadores y devoluciones de llamada, por lo que puedo controlar qué tan profunda debe ser una copia.
posible duplicado de [¿Cómo se hace una copia profunda de un objeto en Java?] (Http://stackoverflow.com/questions/64036/how-do-you-make-a-deep-copy-of- an-object-in-java) –