Saltar al contenido

¿Cómo copio un objeto en Java?

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- obj1que contiene dos objetos, contenidoObj1 y contenidoObj2.
ingrese la descripción de la imagen aquí

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.
ingrese la descripción de la imagen aquí

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).
ingrese la descripción de la imagen aquí

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.

  1. 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 llamada Cloneable. En la práctica, deberíamos implementar esta interfaz si queremos hacer un objeto Cloneable. Object.clone es protegidoentonces debemos anular con un método público para que sea accesible.
  2. 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *