2010-12-28 23 views
1

ich eine Liste haben mit KlassenobjektenSpeicher auf ein Objekt einer Klasse Zuweisung

List a[10]; 

class Hello extends abc implement xyz 
{ 
String mesg1; 
String mesg2; 
Object c; 
Goodbye d; 
// also their getter setters 
} 

a [5] enthält Objekte von Hallo-Klasse sagen

Ich habe 1 an Postion Objekt Instanz kopieren, dann tun einige Änderungen in mesg1 und mesg2 und fügen Sie es in der gleichen Liste am Ende.Ich versuche, dies zu tun, aber wie wir wissen, es ist nur die Referenz, die dort gespeichert ist, so dass ich am Ende die Mesg1 und Mesg2 an Position 1 zu ändern.

irgendwelche Vorschläge? Ich habe versucht, mit clone(), aber kann keine Änderungen an dieser Klasse oder der Klasse Hallo.

+0

Wenn Sie clone() verwenden, denken Sie nicht, dass es implementiert werden sollte? – Lukasz

Antwort

7

Sie müssen Ihren eigenen clone oder einen Kopierkonstruktor als Teil der Hello Klasse angeben.

z. (clone):

public Hello clone() { 
    Hello h; 

    h = new Hello(); 
    h.mesg1 = this.mesg1; 
    h.mesg2 = this.mesg2; 
    h.c = this.c; // Or a deep copy if appropriate 
    h.d = this.d; // Or a deep copy if appropriate 

    return h; 
} 

oder (Copykonstruktor):

public Hello(Hello original) { 
    this.mesg1 = original.mesg1; 
    this.mesg2 = original.mesg2; 
    this.c = original.c; // Or a deep copy if appropriate 
    this.d = original.d; // Or a deep copy if appropriate 
} 

Dann nutzen Sie es

a[5] = new Hello(); 
// set its members 
a[1] = a[5].clone(); // or = new Hello(a[5]); 
// set its members 
1

So möchten Sie klonen/duplizieren Sie ein vorhandenes Objekt, und ändern Sie das doppelte, ohne den Code von Hello.class zu ändern?

Wenn Sie eine neue Instanz der Hello-Klasse mit einem Konstruktor erstellen können, wäre das die einfachste Lösung. Einige der Datenstrukturen so Kopierkonstruktoren, zum Beispiel wie folgt aufgerufen:

Hello original = new Hello(); 
Hello duplicate = new Hello(original); 

Wenn die Klasse nicht so einen Konstruktor hat, können Sie versuchen, indem Sie Reflektion Erstellen einer neuen Instanz. Es gibt einige Bibliotheken, welche Objekte klonen und oder kopieren können ihre Eigenschaften von einem Objekt zum anderen, zum Beispiel:

Hello duplicate = BeanUtils.instantiate(original.getClass()); 
org.springframework.beans.BeanUtils.copyProperties(original, duplicate); 

Oder noch einfacher, das Dienstprogramm Methode der commons-lang:

Hello duplicate = org.apache.commons.lang.SerializationUtils.clone(original); 
0

Sie können eine benutzerdefinierte Klon-Methode für Hello Klasse schreiben, wenn das Objekt nicht zu groß, ist wie folgt:

static Hello cloneHello(Hello h){ 
    Hello newHello = new Hello(); 
    //for primitive and immutable types 
    newHello.setMsg1(h.getMsg1()); 
    newHello.setMsg1(h.getMsg2()); 

    //for mutable objects you can provide cloneMyObject(MyObject o) for each type 
    newHello.setMyObject(cloneMyObject(h.getMyObject())); 

    //and so on .. 

    return newHello; 
} 

Dies kann langwierig erhalten, aber sollte es tun.

Wenn Sie keine neue Instanz von Hello erstellen können, müssen Sie die Serialisierung wie von anderen vorgeschlagen verwenden.

+0

Ja Leute, danke für die Antwort. Ich habe eine Kopie Constructor verwendet und es funktioniert super. – Neeraj

Verwandte Themen