Objekt kopieren und sämtliche Referenzen von diesem Objekt?

beta20

Top Contributor
Hallo,

ich habe eine Klasse A und möchte davon eine Kopie machen. Ebenfalls sollen alle referenzierten Klassen (KlasseB und von KlasseB wiederum KlasseC) etc. auch eine Kopie sein. Nun ist meine Frage, ob ich von KlasseA nur eine Kopie machen kann und diese dann automatisch auch eine Kopie von Klasse B und C machen?

Java:
public Klasse A {
    private KlasseB klasseB;
}

public Klasse B {
    private KlasseC klasseC;
}

public Klasse D {
    private KlasseD klasseD;
}

Die Kopie mache ich durch:


Java:
public class KlasseA implements Cloneable {
    ....
}

Java:
@Override
    public KlasseA clone() throws CloneNotSupportedException {
        
        KlasseA newKlasseA = (KlasseA) super.clone();
        
        return newKlasseA;
    }
 
Nein, automatisch wird bei clone keine Kopie der Felder gemacht.


Aber grundsätzlich bei sowas erstmal die Frage: wofür/warum brauchst du eine tiefe Kopie des Objekts? Erfahrungsgemäß ist das meistens nicht sinnvoll.

Und auch grundsätzlich: statt clone ist meist ein Copy-Konstruktor sinnvoller.
 
Gerade bei komplexen Datenstrukturen (vor allem mit Listen), die in einem Formular mit Unterformularen für einzelne Listenelemente bearbeitet werden muss, ist so was schon ganz sinnvoll, um z.B. die Arbeitskopie mit dem Original zu vergleichen.

Die normale clone()-Methode zu überschreiben ist aber tatsächlich wenig sinnvoll, lieber gleich eine Methode bereitstellen, von der man WEISS, dass sie einen DeepClone erstellt (ich stell hier für gewöhnlich eine createDeepClone() Methode bereit).
Falls clone() das auch machen soll, kann man ja immer noch darauf verweisen.
 
Gerade bei komplexen Datenstrukturen (vor allem mit Listen), die in einem Formular mit Unterformularen für einzelne Listenelemente bearbeitet werden muss, ist so was schon ganz sinnvoll, um z.B. die Arbeitskopie mit dem Original zu vergleichen.
Wobei sich dann meistens auch ein explizites "ViewModel" anbietet, oder sogar was Event-Sourcing mäßiges für den Teil. Das erlaubt dann auch deutlich mehr als nur vergleichen.
 

Zurück
Oben