Unterschiedliche Clone- Methoden

pl4gu33

Top Contributor
ich hab nen bisschen hier im Forum geschaut und hab 2 Methoden zum Klonen von Objekten gefunden,...

so wie ich das sehe, ist Cloneable eine flache Kopie und das zweite eine tiefe Kopie?
gibt es da sonst noch irgendwelche Probleme/Unterschiede, die man beachten sollte? (außer, dass die Interfaces nicht implementiert sind)

Java:
public class Clonetest implements Cloneable,Serializable{
	private JLabel lbl;
	private int zahl;
	
	public static void main(String[] args){
		Clonetest ct=new Clonetest();
		ct.lbl=new JLabel("test");
		ct.zahl=5;
		
		Clonetest ct1=ct.clone();
		ct1.zahl=6;
		ct1.lbl.setText("Test2");		
		System.out.println(ct1.lbl.getText());
		System.out.println(ct.lbl.getText());
		System.out.println(ct1.zahl);
		System.out.println(ct.zahl);
		
		System.out.println("---------");
		
		Clonetest ct2=Clonetest.clone2(ct);
		ct2.zahl=7;
		System.out.println(ct2.zahl);
		System.out.println(ct.zahl);
		ct2.lbl.setText("Test3");		
		System.out.println(ct2.lbl.getText());
		System.out.println(ct.lbl.getText());
		
	}

	public Clonetest clone() {	
	try {
		return (Clonetest) super.clone();
	} catch (CloneNotSupportedException e1) {
		// TODO Auto-generated catch block
		e1.printStackTrace();
	}	
	return null;
	}
	
	public static Clonetest clone2(Clonetest copyObject){
		   try {
			      ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
			      ObjectOutputStream oos = new ObjectOutputStream(baos);
			      oos.writeObject(copyObject);
			      ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
			      ObjectInputStream ois = new ObjectInputStream(bais);
			      Clonetest deepCopy = (Clonetest) ois.readObject();
			      return deepCopy;
			    } catch (IOException e) {
			      e.printStackTrace();
			    } catch(ClassNotFoundException e) {
			      e.printStackTrace();
			    }
			    return null;
	}
}
 
Die erste Variante ist schon ein wenig geschummelt, da ja einfach nur die clone-Methode der super-Klasse aufgerufen wird. Kann reichen, wird es idR aber wohl eher nicht.
Die zweite Variante funktioniert nur bei serialisierbaren Klassen.

clone() sollte eigentlich grundsätzliche eine tiefe Kopie erzeugen(, oder irre ich da?)

Gruß Fant
 
Dass clone() von Object das i.A. nicht macht ist klar. Das hat ja der Themenersteller auch schon festgestellt. Ich meinte, dass man clone() in seiner eigenen Klasse so implementieren sollte, dass eine tiefe Kopie erstellt wird, weil es doch sonst kein "richtiger" Klon ist.
Oder hast du dich jetzt gar nicht auf meinen Post bezogen?
 
Zuletzt bearbeitet:
Doch, hab mich schon auf dich bezogen. Hatte gedacht du meinst mit clone() die Methode aus Object 😉
Ich würde auch nicht sagen dass man grundsätzlich immer tiefe Kopien erzeugen sollte. Wenn du Beispielsweise immutable Klassen hast brauchst du keine tiefe Kopie, da kannst du dir den overhead sparen.
 
Zuletzt bearbeitet von einem Moderator:
okay also schließe ich daraus, dass es keine weiteren Probleme bei den Methoden gibt und ich sie auch soweit richtig gedeutet habe ... danke schon mal an euch beide^^
 

Zurück
Oben