Tiefe Kopie

Neue Frage »

Auf diesen Beitrag antworten »
neuling96 Tiefe Kopie

Folgender Code stellt eine Tiefekopie dar
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
public class DeepCopy implements Cloneable
{
private int zahl;
private int[] zahlen;
public DeepCopy(int zahl, int[] zahlen)
{
this.zahl = zahl;
this.zahlen = zahlen;
}
public Object clone()
{
int neueZahl = this.zahl;
int[] neueZahlen = new int[this.zahlen.length];
for(int i=0; i<this.zahlen.length; i++)
{
neueZahlen[i] = this.zahlen[i];
}
DeepCopy kopie = new DeepCopy(neueZahl, neueZahlen);
return kopie;
}
}




Was ist am Code nicht optimal gelöst?




1.
Wenn ich eine beliebige Klasse habe
also

beliebige Klasse h= new beliebige Klasse();
beliebige Klasse x= h.clone();// habe ich damit einen tiefe kopie erstellt?

2. zu der eig. Frage, weiß ich nicht..
 
Auf diesen Beitrag antworten »
Karlito RE: Tiefe Kopie

Zitat:
Original von neuling96
1.
Wenn ich eine beliebige Klasse habe
also

beliebige Klasse h= new beliebige Klasse();
beliebige Klasse x= h.clone();// habe ich damit einen tiefe kopie erstellt?

Nicht unbedingt.
1. Clone ist standardmäßig von der Sichtbarkeit protected
2. Das Standardverhalten von clone ist folgendermaßen:
- Wenn das Interface Cloneable nicht implementiert ist, wird eine CloneNotSupportedException geworfen
- Wenn Cloneable Implementiert wird wird das Objekt flach kopiert. D.h. referenzierte Objekte werden nicht Kopiert, sondern nur deren Referenz.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
public class DeepCopy implements Cloneable
{
	private int zahl;
	private int[] zahlen;
	public DeepCopy(int zahl, int[] zahlen)
	{
		this.zahl = zahl;
		this.zahlen = zahlen;
	}
	public Object clone()
	{
		DeepCopy kopie = new DeepCopy(this.zahl, this.zahlen);
		return kopie;
	}
}

Hier wird eine flache Kopie des Objektes erzeugt (manuell), aber keine tiefe Kopie. Das array des neues Objektes ist eine Referenz auf das Array des alten Objektes und somit arbeiten beide Objekte mit genau dem selben Array (und keinen separaten Kopien). Soetwas kann gewollt sein, somit wäre clone() aber eben nicht dazu geeignet eine tiefe Kopie des Objektes zu erzeugen.

Zitat:
Original von neuling96
2. zu der eig. Frage, weiß ich nicht..


Ich nehme an, dass es darauf anspielt, dass das Kopieren des Arrays ineffektiv ist, da immer nur ein Element kopiert wird. Es ist oft effektiver mehrere Elemente gleichzeitg zu kopieren. Damit man sich nicht um die optimale Implementierung kümmern muss, stellt Java eine Methode bereit um Arrays effektiv zu kopieren.
Es wäre auch möglich, dass darauf angespielt wird, dass clone() immer Object zurückgibt und immer auf den eigentlichen Typ gecastet werden muss. Lösung wäre eine Methode anzulegen, bei der der Rückgabetyp korrekt ist. Leider ist das nicht mit dem Interface Cloneable vereinbar.

Gruß,

Karlito
Auf diesen Beitrag antworten »
neuling96

danke
ich habs noch ganz verstanden, aber das kommt hoffentlich
Auf diesen Beitrag antworten »
Karlito

Achso, was ich vergessen habe ist die Methode, die das Kopieren von Arrays übernimmt:
System.arraycopy()
 
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »