Archiv verlassen und diese Seite im Standarddesign anzeigen : Java Cloneable
weiß jemand bei Java wie ich am einfachsten eine "echte" kopie eines Objects erzeuge? ( clone() erzeugt irgendwie nur eine neue referenz)
beispiel
Vektor x, x2;
blabla
x2 = x.clone();
x.xkoordinate =+ 1
System.out.print(x.xkoordinate)
System.out.print(x2.xkoordinate)
eigentlich sollten diese werte ja nun verschieden sein wenn es sich um eine echte kopie handelt, sind sie aber nicht
Senior Sanchez
2006-05-10, 22:13:17
Clone ist sone Sache.
Es wird ja unterschieden zwischen flachen und tiefen Kopien. Ne flache Kopie kopiert das Objekt ansich, Objekte die aber Attribute dieses zu kopierenden Objekts sind werden nicht kopiert, sondern die Referenzen werden dagegen vom Original weitergenutzt.
Tiefe Kopien kopieren dagegen Objekte vollständig, was natürlich auch bedeutet, dass von allen Attributen, die selber Objekte sind auch wieder tiefe Kopien angefertigt werden müssen usw.
Bei Clone() weißt du aber ansich nicht, obs jetzt ne flache Kopie ist, oder ne tiefe.
Ich hatte vor einiger Zeit hier schonmal gefragt und das beste ist echt, nicht clone zu nutzen, sondern einen copy-Constructor.
Dazu schreibste einfach für die klasse die Objektkopien ermöglichen soll einen weiteren Konstruktor der das zu kopierende Objekt übergeben bekommt.
In diesem Konstruktor kopierst du nun die Daten des Parameterobjekts auf das neue Objekt.
Die Lösung hat sich zumindest bei mir in der Praxis als recht gut und handlich erwiesen, zumal eindeutig ist, was für eine Kopie angefertigt wird. Vorsicht ist dort geboten, wenn du Objekte kopieren willst die zyklischen Referenzen aufeinander enthalten. Da musste dir dann noch etwas überlegen.
danke dir ;) habs gemacht wie du gesagt hast und nun funktionierts..
SGT.Hawk
2006-05-10, 23:47:32
Eine weitere Möglichkeit ist, die ich mal benutzt habe,ist das Objekt zu serialiesieren unf zu deserialisieren.(ObjectInpputStream/ObjectOutStream) damit erzeugt man definitiv tiefe Kopien.
Monger
2006-05-11, 00:44:48
Das Problem ist halt, dass eine tiefe Kopie fast nie Sinn macht. In aller Regel ist ein Objekt mit sehr, SEHR vielen anderen Objekten referenziert. Die müssen bei einer tiefen Kopie alle mitgeschleppt werden.
Es ist darüber hinaus auch unlogisch. Zwei identische Objekte SIND das selbe! Eine Kopie eines Objekts kann dem Original allenfalls ähnlich, aber niemals identisch sein.
Senior Sanchez
2006-05-11, 18:10:37
SGT.Hawk[/POST]']Eine weitere Möglichkeit ist, die ich mal benutzt habe,ist das Objekt zu serialiesieren unf zu deserialisieren.(ObjectInpputStream/ObjectOutStream) damit erzeugt man definitiv tiefe Kopien.
Das wäre auch ne Sache, bloß funktioniert das so einwandfrei wenn man mehrere Objekte hat die auch noch gegenseitig voneinander abhängen? Ich meine, das soll inner Kopie ja genauso sein und dazu müsste man danach vllt noch diese kopierten Objekte manuell an die jeweilige Kopie dranhängen, oder? (Etwas verwirrend geschrieben, ich weiß, aber vllt versteht mans ja trotzdem)
@monger
Also ne vollständige, tiefe Kopie macht sicher selten Sinn. Aber bei meinem Fall neulich brauchte ich definitiv tiefe Kopien.
Es ging dabei um simulierte Spiele und die entsprechenden Teams. Tiefe Kopien waren daher nötig, weil ich ohne ne Datenbank zu nutzen, einen kleinen Bestand an Spielen und Teams haben wollte um anschließend Statistik-Werte daraus erzeugen zu können. Dies wollte ich aber so flexibel machen, dass ich tatsächlich noch auf die entsprechenden Spiele direkt zugreifen und alle Daten auslesen konnte.
Gleichzeitig mussten die Originale aber bestehen bleiben, weil diese die Ausgangsbasis für neue Berechnungen waren.
vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd.