Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Tiefe Kopie » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Tiefe Kopie
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
neuling96
unregistriert
Tiefe Kopie Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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..
18.01.2015 15:18
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

RE: Tiefe Kopie Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
18.01.2015 17:28 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
neuling96
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

danke
ich habs noch ganz verstanden, aber das kommt hoffentlich
18.01.2015 20:27
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Achso, was ich vergessen habe ist die Methode, die das Kopieren von Arrays übernimmt:
System.arraycopy()
19.01.2015 07:44 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Tiefe Kopie