2010-03-29 17 views
6

Esiste un modo generico per ottenere la copia di un oggetto esistente in un altro?Copia oggetto in un altro

Si supponga che MyObj contenga i campi id e name. Come questo:

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

Invece di

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

fare qualcosa come segue:

myObj_2.copyFrom(myObj_1) 

in modo che essi sono diversi casi, ma hanno uguali proprietà.

+1

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

+1

Questo [risposta] (http: // StackOverflow. it/questions/869033/how-do-i-copy-un-oggetto-in-java/9834683 # 9834683) ti aiuterà. –

risposta

4
+3

Sebbene questo sia corretto, Joshua Bloch mette in guardia dall'usare il clone in Java efficace. Meglio creare un costruttore di copie. –

0

Il clone() - Metodo è esattamente per questo lavoro.

8

La convenzione è di farlo in fase di costruzione con un costruttore che accetta un parametro del proprio tipo.

MyObj myObj_2 = new MyObj (myObj_1);

Non esiste alcuna convenzione Java per sovrascrivere le proprietà esistenti di un oggetto da un altro. Questo tende ad andare contro la preferenza per gli oggetti immutabili in Java (dove le proprietà sono impostate in fase di costruzione a meno che non ci sia una buona ragione per non farlo).

Modifica: per quanto riguarda clone(), molti tecnici lo scoraggiano in Java moderno perché ha una sintassi obsoleta e altri svantaggi. http://www.javapractices.com/topic/TopicAction.do?Id=71

0

È possibile utilizzare l'introspezione per automatizzare l'implementazione delle routine di clonazione, in modo da poter essere sicuri di non dimenticare di copiare alcuni campi.

7

Uso costruttore di copia:

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

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

Il metodo clone() è più adatto per queste esigenze. Ogni volta che il metodo clone() viene richiamato su un oggetto, la JVM creerà effettivamente un nuovo oggetto e copierà tutto il contenuto dell'oggetto precedente nell'oggetto appena creato. Prima di utilizzare il metodo clone() è necessario implementare l'interfaccia Cloneable e sovrascrivere il metodo 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(); 
     } 
    } 
} 
Problemi correlati