Montag, 9. August 2010

Java .clone()

Man kann Objekte in Java per eineInstanz.clone() kopieren, wenn die Klasse das Interface java.lang.Cloneable() implementiert. Dieses Interface ist ein sogenanntes Marker-Interface ohne definierte Methoden. Die Methode .clone() wird hingegen von der Basisklasse Object definert undzwar als protected. Eine Klasse, welche Cloneable implementiert sollte per Konvention die Methode .clone() aus Object als public Methode überschreiben. Man beachte, das die Klasse Object selbst nicht das Cloneable Interface implementiert und man daher auf Instanzen von Object eine CloneNotSupportedException beim Aufruf von .clone() erhält.
Die überschriebene public Variante von .clone() sollte als erstes super.clone() aufrufen und dann alle Member des Klon-Objektes, welche Variablen (ohne final Schlüsselwort) auf nicht-konstante Daten (mutable) besitzt, mit Kopien solcher Daten besetzen. Denn die Konvention von .clone() sieht eine komplette Unabhängigkeit von Objekten zu ihren Klonen vor. Die Implementierung von .clone() in Object vollzieht eine nicht-rekursive Zuweisung aller Membervariablen vom Original an die entsprechenden Membervariablen vom Klon. Es findet keine Überprüfung auf Referenzwerte als Daten statt. Daher muß sich die Cloneable implementierende Klasse um diese Details kümmern.
Die Intention des Klon-Vorgangs aus Object.clone() ist es folgende Eigenschaften zu haben:
  • x.clone() != x
  • x.clone().getClass() == x.getClass()
  • x.clone().equals(x)

Links:

Keine Kommentare:

Kommentar veröffentlichen