You are not logged in.

yv

Junior Schreiberling

  • "yv" is female
  • "yv" started this thread

Posts: 229

Date of registration: Dec 11th 2001

1

Tuesday, September 5th 2006, 6:22pm

Java: Interface Cloneable

Hallo,

ich möchte eine Deep Copy eines Objekts meiner Klasse erzeugen.
Bei Klassen, die das Interface Cloneable implementieiren (z.B. Vector) ist das ja auch gar kein Problem. Wenn ich aber das Interface implementiere, muss ich die clone()-Methode von java.lang.Object überschreiben.
Wie überschreibe ich diese Methode, ohne einen Stack Overflow durch so schöne rekursive Konstrukte wie " public MyClass clone(){ return this.clone();} zu kreieren?

Vielen Dank schonmal, falls das jemand weiss.

dfex

Junior Schreiberling

  • "dfex" is male

Posts: 248

Date of registration: Dec 11th 2001

2

Tuesday, September 5th 2006, 6:29pm

RE: Java: Interface Cloneable

du musst auf jedenfall schonmal

Source code

1
public Object clone(){}

überschreiben. Dein Aufruf:

Source code

1
public MyClass clone(){ return this.clone();}

ist quasi eine Endlosschleife. D.h. this.clone(); ruft genau die Methode auf, die du da definierst. Hab auch gerade nix zum ausprobieren, aber theoretisch dürftest du diese Methode auch gar nicht deklarieren können. Oder?! ?( :) Da der Rückgabewert von Object abweicht, ist nicht mehr klar, welche Methode denn bei clone() verwendet werden soll. Dabei müsste eigentlich schon der Compiler meckern *kopfkratz*, oder ich stehe aufm Schlauch.

Markus

the one and only Unterstrich!

Posts: 2,571

Date of registration: Oct 9th 2003

3

Tuesday, September 5th 2006, 6:51pm

Für das Interface clonable wird dieser Link wahrscheinlich alle deine Fragen beseitigen. Allerdings wird er dir auch erklären, dass clone() lediglich eine flache (shallow) Kopie und keine tiefe (deep) Kopie der Attribute des Objektes zurückliefert.
Dafür hilft bei Java meiner Erkenntnis nach nur ein Objekt zu serialisieren und wieder deserialisieren (gibt es dieses Wort?).

Ach ja, und weil ich ja scheinbar eh schon die ganze Arbeit abnehme, hier auch der Link zur deep copy ;)
Charmant sein? Hab ich längst aufgegeben. Glaubt mir doch eh keiner...

silence

Junior Schreiberling

Posts: 177

Date of registration: Dec 11th 2001

Location: reagenzglas

Occupation: tellerwäscher

4

Tuesday, September 5th 2006, 8:58pm

Quoted

Original von Markus
Dafür hilft bei Java meiner Erkenntnis nach nur ein Objekt zu serialisieren und wieder deserialisieren (gibt es dieses Wort?).


Das ist die eine, aber sehr imperformante, Möglichkeit, eine Deep-Copy zu erzeugen. Außerdem hast Du nicht immer die Möglichkeit dazu (z. B. wenn ein Objekt einer Fremdlib nicht serialisierbar ist). Besser, wenn Du ein bisschen auf die Geschwindigkeit achten musst, ist es, wenn du hier selbst Hand anlegst.

Man kann Deep-Copys für beliebige Objektstrukturen erzeugen. Allerdings kann dies recht komplex werden, gerade wenn es sich um komplizierte Graphenstrukturen handelt (aber machbar ist das alles).

BTW.: dies ist das snippet der Wahl, wenn es um flache Kopien geht.

Source code

1
2
3
4
5
6
7
public Object clone() { 
    try {
        return super.clone();
    } catch ( CloneNotSupportedException e) {
        throw new Error("aaargh", e);
    }
}
"Wir stecken immer in der Scheisse, nur die Tiefe ändert sich."
(Ein unbekannter Softwareentwickler)

dfex

Junior Schreiberling

  • "dfex" is male

Posts: 248

Date of registration: Dec 11th 2001

5

Tuesday, September 5th 2006, 9:33pm

RE: Java: Interface Cloneable

Quoted

Original von dfex
du musst auf jedenfall schonmal

Source code

1
public Object clone(){}

überschreiben. Dein Aufruf:

Source code

1
public MyClass clone(){ return this.clone();}

ist quasi eine Endlosschleife. D.h. this.clone(); ruft genau die Methode auf, die du da definierst. Hab auch gerade nix zum ausprobieren, aber theoretisch dürftest du diese Methode auch gar nicht deklarieren können. Oder?! ?( :) Da der Rückgabewert von Object abweicht, ist nicht mehr klar, welche Methode denn bei clone() verwendet werden soll. Dabei müsste eigentlich schon der Compiler meckern *kopfkratz*, oder ich stehe aufm Schlauch.

oh Müll, Müll, Müll. Sorry.
Habe das Clonen scheinbar schon länger nicht bentutzt, da mir das Deep-Copy und das zusätzliche Casten nach dem Clonen nicht gefiel (insbesondere Deep-Copy fand ich öfters sehr fehleranfällig).
Und jetzt les ich gerade:

Quoted


Da es seit Java 5 kovariante Rückgabetypen gibt, muss clone() nicht lediglich Object liefern, sondern kann auch einen Untertyp geben.

Das elemeniert schonmal das Casten. Hab ich echt "übersehen" 8o sorry

Der Stack-Overflow wird aber dennoch durch den Aufruf this.clone(); erzeugt, der die gerade überschriebene Methode wieder aufruft. Siehe silence, muss es heissen super.clone();

Markus

the one and only Unterstrich!

Posts: 2,571

Date of registration: Oct 9th 2003

6

Wednesday, September 6th 2006, 4:30pm

Quoted

Original von silence

Quoted

Original von Markus
Dafür hilft bei Java meiner Erkenntnis nach nur ein Objekt zu serialisieren und wieder deserialisieren (gibt es dieses Wort?).
Das ist die eine, aber sehr imperformante, Möglichkeit, eine Deep-Copy zu erzeugen.

Erstmal streich das "nur" bei mir raus, dass ist natürlich falsch.
Das das ganze natürlich nicht sehr performant ist, ist mir klar, dafür ist es relativ einfach zu schreiben, da deep copies, wie von dir geschrieben, mit unter recht kompliziert sein können.
Charmant sein? Hab ich längst aufgegeben. Glaubt mir doch eh keiner...

yv

Junior Schreiberling

  • "yv" is female
  • "yv" started this thread

Posts: 229

Date of registration: Dec 11th 2001

7

Wednesday, September 6th 2006, 10:49pm

vielen Dank für die vielen Beiträge, habs per Hand hinbekommen.