2010-03-29 26 views
6

¿Existe alguna forma genérica de lograr copiar un objeto existente en otro?Copiar objeto en otro

Supongamos que MyObj tiene un campo id y name. De esta manera:

MyObj myObj_1 = new MyObj(1, "Name 1"); 
MyObj myObj_2 = new MyObj(2, "Name 2"); 

En lugar de

myObj_2.setName(myObj_1.getName()) // etc for each field 

hacer algo como lo siguiente:

myObj_2.copyFrom(myObj_1) 

de modo que son diferentes casos, pero tienen propiedades iguales.

+1

ver http://stackoverflow.com/questions/64036/how-do-you-make-a-deep-copy-of-an-object – karlipoppins

+1

Esto [Respuesta] (http: // stackoverflow. com/questions/869033/how-do-i-copy-an-object-in-java/9834683 # 9834683) lo ayudará. –

Respuesta

4
+3

Aunque esto es correcto, Joshua Bloch advierte contra el uso de clones en Java efectivo. Mejor crear un constructor de copia. –

0

El clon() - Método es precisamente para este trabajo.

8

La convención es hacer esto en tiempo de construcción con un constructor que toma un parámetro de su propio tipo.

MyObj myObj_2 = new MyObj (myObj_1);

No existe una convención de Java para sobrescribir las propiedades existentes de un objeto de otro. Esto tiende a ir en contra de la preferencia por objetos inmutables en Java (donde las propiedades se establecen en tiempo de construcción a menos que haya una buena razón para no hacerlo).

Editar: con respecto a clone(), muchos ingenieros desalientan esto en Java moderno porque tiene una sintaxis obsoleta y otros inconvenientes. http://www.javapractices.com/topic/TopicAction.do?Id=71

0

Puede utilizar la introspección para automatizar la implementación de sus rutinas de clonación, por lo que puede estar seguro de que no se olvide de copiar algunos campos.

7

Uso constructor de copia:

public class YourObject { 
    private String name; 
    private int age; 

    public YourObject(YourObject other) { 
    this.name = other.name; 
    this.age = other.age; 
    } 
} 
0

El método clone() es el más adecuado para estos requerimientos. Siempre que se llame al método clone() en un objeto, la JVM realmente creará un nuevo objeto y copiará todo el contenido del objeto anterior en el objeto recién creado. Antes de utilizar el método clone(), debe implementar la interfaz Cloneable y anular el método clone().

public class CloneExample implements Cloneable 
{ 
    int id; 
    String name; 

    CloneExample(int id, String name) { 
     this.id = id; 
     this.name = name; 
    } 

    @Override 
    protected Object clone() throws CloneNotSupportedException { 
     return super.clone(); 
    } 

    public static void main(String[] args) { 
     CloneExample obj1 = new CloneExample(1,"Name_1"); 

     try { 
      CloneExample obj2 = (CloneExample) obj1.clone(); 
      System.out.println(obj2.id); 
      System.out.println(obj2.name); 
     } catch (CloneNotSupportedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
Cuestiones relacionadas