Esta es la solución más completa que te podemos dar, pero primero mírala pausadamente y valora si es compatible a tu proyecto.
Solución:
Crea un constructor de copias:
class DummyBean
private String dummy;
public DummyBean(DummyBean another)
this.dummy = another.dummy; // you can access
Cada objeto también tiene un método de clonación que se puede usar para copiar el objeto, pero no lo use. Es demasiado fácil crear una clase y hacer un método de clonación incorrecto. Si va a hacer eso, lea al menos lo que Joshua Bloch tiene que decir al respecto en Java efectivo.
Básico: Copia de objetos en Java.
Supongamos un objeto- obj1
que contiene dos objetos, contenidoObj1 y contenidoObj2.
copia superficial:
la copia superficial crea una nueva instance
de la misma clase y copia todos los campos a la nueva instancia y la devuelve. clase de objeto provee un clone
método y proporciona soporte para la copia superficial.
Copia profunda:
Una copia profunda ocurre cuando un objeto se copia junto con los objetos a los que se refiere. La imagen de abajo muestra obj1
después de que se haya realizado una copia profunda en él. no solo tiene obj1
sido copiado, pero los objetos que contiene también se han copiado. Nosotros podemos usar Java Object Serialization
para hacer una copia profunda. Desafortunadamente, este enfoque también tiene algunos problemas (ejemplos detallados).
Posibles problemas:clone
es difícil de implementar correctamente.
Es mejor usar copia defensiva, copiar constructores (como responde @egaga) o static métodos de fábrica.
- Si tienes un objeto, que sabes que tiene un público
clone()
método, pero no conoce el tipo de objeto en tiempo de compilación, entonces tiene un problema. Java tiene una interfaz llamadaCloneable
. En la práctica, deberíamos implementar esta interfaz si queremos hacer un objetoCloneable
.Object.clone
es protegidoentonces debemos anular con un método público para que sea accesible. - Otro problema surge cuando intentamos copia profunda de un objeto complejo. Suponga que el
clone()
El método de todas las variables de objetos miembro también hace una copia profunda, esta es una suposición demasiado arriesgada. Debe controlar el código en todas las clases.
Por ejemplo, org.apache.commons.lang.SerializationUtils tendrá un método para la clonación profunda usando serialización (Fuente). Si necesitamos clonar Bean, hay un par de métodos de utilidad en org.apache.commons.beanutils (Fuente).
cloneBean
clonará un bean en función de los captadores y definidores de propiedades disponibles, incluso si la clase del bean en sí no implementa Cloneable.copyProperties
Copiará los valores de propiedad del bean de origen al bean de destino para todos los casos en los que los nombres de propiedad sean los mismos.
En el paquete import org.apache.commons.lang.SerializationUtils;
hay un método:
SerializationUtils.clone(Object);
Ejemplo:
this.myObjectCloned = SerializationUtils.clone(this.object);
Si guardas alguna sospecha y capacidad de desarrollar nuestro escrito te proponemos ejecutar una explicación y con gusto lo ojearemos.