Wie lässt sich ein Objekt klonen?
Beim Klonen eines Objektes wird dies mit allen seinen Elementen
identisch kopiert und an einem gesonderten Speicherplatz
abgelegt. Um dies zu erreichen, muss sichergestellt werden, dass
der momentane Zustand des zu klonenden Objektes exakt erfasst
wird. Er besteht hauptsächlich aus den Werten, die in den
Klassen- und Instanzvariablen des Objektes gespeichert sind.
Die
vollständige Erfassung dieser Werte muss durch das
Überschreiben der Methode clone()
sichergestellt werden.
Das Beispiel zeigt eine einfache Klasse mit zwei Instanzvariablen und den zugehörigen Accessor-Methoden.
public class Moped { private int hubraum; private int ps; public int getHubraum() { return hubraum; } public void setHubraum(int hubraum) { this.hubraum = hubraum; } public int getPs() { return ps; } public void setPs(int ps) { this.ps = ps; } @Override public Object clone() { Moped moped = new Moped(); moped.setHubraum(hubraum); moped.setPs(ps); return moped; } }
Neben den Gettern und Settern weist die Klasse noch die Methode
clone()
auf. Sie überschreibt java.lang.Object.clone()
und ist entsprechend mit der Annotation @Override
gekennzeichnet. In ihr wird ein neues Objekt der eigenen Klasse
erzeugt, dessen Variablen die Werte des aktuellen Objektes
übergeben bekommen. Zu beachten ist, dass die neu erzeugte
Instanz als Typ Object
zurückgegeben wird.
Ggf. muss die geklonte Instanz dann gecastet werden.
public class CloneBsp { public static void main(String[] args) { Moped m1 = new Moped(); m1.setHubraum(1200); m1.setPs(98); Moped m2 = (Moped) m1.clone(); // casting System.out.println(m1); // Moped@677327b6 System.out.println(m2); // Moped@14ae5a5 } }
An der Ausgabe ist zu erkennen, dass beide Objekte
unterschiedliche Speicherplätze besetzen. Möchte man
an dieser Stelle einen Überblick über die Werte der
Objektvariablen erhalten, so bietet es sich an, java.lang.Object.toString()
zu überschreiben. Siehe hierzu den
gesonderten Artikel zum Thema.
Den vollständigen
Quelltext mit einer toString()
-Implementierung
zeigt das folgende Listing:
public class CloneBsp { public static void main(String[] args) { Moped m1 = new Moped(); m1.setHubraum(1200); m1.setPs(98); Moped m2 = (Moped) m1.clone(); // casting System.out.println(m1); System.out.println(m2); } } public class Moped { private int hubraum; private int ps; public int getHubraum() { return hubraum; } public void setHubraum(int hubraum) { this.hubraum = hubraum; } public int getPs() { return ps; } public void setPs(int ps) { this.ps = ps; } @Override public Object clone() { Moped moped = new Moped(); moped.setHubraum(hubraum); moped.setPs(ps); return moped; } @Override public String toString() { return "Moped [Hubraum: " + hubraum + ", PS: " + ps + "]"; } }
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.