Klonen (clone)
Die Methode clone() aus java.lang.Object erzeugt eine identische Kopie des Objekts, auf das sie angewendet wird. Dabei wird allen Feldern der Wert des ursprünglichen Objekts gesetzt.
Clone steht allerdings nur zur Verfügung, wenn die betreffende Klasse das Interface java.lang.Cloneable implementiert. Cloneable ist ein sogenanntes Zeigerinterface, es zeigt an, daß eine Klasse bestimmte Eigenschaften besitzt, schreibt aber keine Methoden vor oder definiert keine Konstanten. Implementieren Sie Cloneable, wenn Sie das Clonen ihrer Klasse gestatten wollen. Sie sollten dabei einfach die Basisimplementierung aus java.lang.Object mit„super.clone()" aufrufen, da sie eine sinnvolle Implementierung anbietet. Die Klasse Object selbst ist aber nicht Cloneable, weil sie diese Eigenschaft an alle anderen Klassen vererben würde. Ihre Methode „clone()" ist daher protected.
Das folgende Beispiel zeigt, wie clone() verwendet werden kann. Unsere Klasse besitzt eine Membervariable, da wir wissen wollen, wie sich das Clonen auf sie auswirkt.
Der Test auf Identität (c1 == c2) ergibt false, es handelt sich also offenbar um zwei verschiedene Objekte.
Interessant ist aber, dass sie eine gemeinsame Membervariable besitzen. Verändern wir „buffer" in c1, wird offenbar auch „buffer" in c2 verändert! Offenbar werden also nur die Objektreferenzen, nciht aber die Objekte selbst kopiert.
Manchmal kann es sinnvoll sein, die clone() - Methode aus java.lang.Object zu überschreiben, um eine eigene Implementierungvon clone zu realisieren. In diesem Fall sollte man sie natürlich public machen. Der auskommentierte Code biete eine solche Implementierung an. Entfernen Sie die Zeilen-Kommentare, kompilieren und starten Sie das Programm erneut. Wie Sie erkennen, implementieren wir die clone()-Methode, indem wir mit super.clone() die Methode aus Object aufrufen, um den Klon zu erhalten. Anschliessend erzeugen wir mit c.setValue(..) eine neue Membervariable, sodass die Unabhängigkeit gewährt ist.
Aufgabe: CloneEquals
Es ist unbefriedigend, dass equals() hier false bei gleicher Membervariable ergibt. Implementieren Sie equals und ggf. hashCode, um dies zu ändern. Rufen Sie sich in Erinnerung, was wir im Kapitel Gleichheit über diese Methoden herausgefunden haben.
Musterlösung: java1.aufg.kap_4.CloneEquals