Minitutorial - Cloneable: Unterschied zwischen den Versionen
Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen (→"final" Schlüsselwörter eventuell entfernen) |
K |
||
(3 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 2: | Zeile 2: | ||
[[Kategorie:Tutorials (Java)]] | [[Kategorie:Tutorials (Java)]] | ||
− | =Alle Klassen, die "Cloneable" implementieren, sollten "'''public''' Object clone" überschreiben= | + | =Alle [[Klasse|Klassen]], die "Cloneable" implementieren, sollten "'''public''' Object clone" überschreiben= |
− | Diese "public" Methode sollte zunächst "super.clone()" aufrufen. | + | Diese "public"-[[Methode]] sollte zunächst "super.clone()" aufrufen. |
Beispiel: | Beispiel: | ||
− | < | + | <syntaxhighlight lang="java">public Object clone() throws CloneNotSupportedException { |
Object result = super.clone(); | Object result = super.clone(); | ||
return result; | return result; | ||
− | }</ | + | }</syntaxhighlight> |
=Danach sollte sie noch irgendwelche Felder bearbeiten, die zusätzliche Beachtung erfordern= | =Danach sollte sie noch irgendwelche Felder bearbeiten, die zusätzliche Beachtung erfordern= | ||
− | Gewöhnlich bedeutet dies, "mutable" Objekte zu kopieren und die Referenzen | + | Gewöhnlich bedeutet dies, "mutable" [[Objekt|Objekte]] zu kopieren und die [[Referenz|Referenzen]] |
zu diesen Objekten mit Referenzen auf den Kopien zu ersetzen. | zu diesen Objekten mit Referenzen auf den Kopien zu ersetzen. | ||
− | Am | + | Am einfachsten erreichen wir dies, indem wir rekursiv "clone" auf den betreffenden Feldern aufrufen. |
Beispiel: | Beispiel: | ||
− | < | + | <syntaxhighlight lang="java">public Object clone() throws CloneNotSupportedException { |
MeineKlasse result = (MeineKlasse)super.clone(); | MeineKlasse result = (MeineKlasse)super.clone(); | ||
result.elements = (Object[]) elements.clone(); | result.elements = (Object[]) elements.clone(); | ||
return result; | return result; | ||
− | }</ | + | }</syntaxhighlight> |
− | =Es kann | + | =Es kann auch notwendig sein, eine "tiefe" Kopie zu erstellen= |
Beispiel: | Beispiel: | ||
− | < | + | <syntaxhighlight lang="java">public class MeineKlasse implements Cloneable{ |
privates Entry[] buckets = ...; | privates Entry[] buckets = ...; | ||
Zeile 44: | Zeile 44: | ||
Object value; | Object value; | ||
Entry next; | Entry next; | ||
+ | Entry(Object key, Object value, Entry next){ | ||
+ | this.key =key; | ||
+ | this.value = value; | ||
+ | this.next =next; | ||
+ | } | ||
//Recursively copy the linked list headed by this Entry | //Recursively copy the linked list headed by this Entry | ||
Entry deepCopy(){ | Entry deepCopy(){ | ||
Zeile 56: | Zeile 61: | ||
// } | // } | ||
} | } | ||
− | }</ | + | }</syntaxhighlight> |
="final" Schlüsselwörter müssen eventuell entfernt werden= | ="final" Schlüsselwörter müssen eventuell entfernt werden= | ||
Um eine Klasse "cloneable" zu machen, kann es manchmal notwendig sein, | Um eine Klasse "cloneable" zu machen, kann es manchmal notwendig sein, | ||
von einigen Feldern die "final" Schlüsselwörter zu entfernen. | von einigen Feldern die "final" Schlüsselwörter zu entfernen. |
Aktuelle Version vom 22. Dezember 2018, 10:37 Uhr
Inhaltsverzeichnis
- 1 Alle Klassen, die "Cloneable" implementieren, sollten "public Object clone" überschreiben
- 2 Danach sollte sie noch irgendwelche Felder bearbeiten, die zusätzliche Beachtung erfordern
- 3 Es kann auch notwendig sein, eine "tiefe" Kopie zu erstellen
- 4 "final" Schlüsselwörter müssen eventuell entfernt werden
Alle Klassen, die "Cloneable" implementieren, sollten "public Object clone" überschreiben
Diese "public"-Methode sollte zunächst "super.clone()" aufrufen. Beispiel:
public Object clone() throws CloneNotSupportedException {
Object result = super.clone();
return result;
}
Danach sollte sie noch irgendwelche Felder bearbeiten, die zusätzliche Beachtung erfordern
Gewöhnlich bedeutet dies, "mutable" Objekte zu kopieren und die Referenzen zu diesen Objekten mit Referenzen auf den Kopien zu ersetzen. Am einfachsten erreichen wir dies, indem wir rekursiv "clone" auf den betreffenden Feldern aufrufen. Beispiel:
public Object clone() throws CloneNotSupportedException {
MeineKlasse result = (MeineKlasse)super.clone();
result.elements = (Object[]) elements.clone();
return result;
}
Es kann auch notwendig sein, eine "tiefe" Kopie zu erstellen
Beispiel:
public class MeineKlasse implements Cloneable{
privates Entry[] buckets = ...;
public Object clone() throws CloneNotSupportedException{
MeineKlasse result = (MeineKlasse)super.clone();
result.buckets = new Entry[buckets.length];
for(int i = 0; i < buckets.length; i++){
if(buckets[i] != null){
result.buckets[i] = buckets[i].deepCopy();
}
}
return result;
}
private static class Entry{
Object key;
Object value;
Entry next;
Entry(Object key, Object value, Entry next){
this.key =key;
this.value = value;
this.next =next;
}
//Recursively copy the linked list headed by this Entry
Entry deepCopy(){
return new Entry(key, value, next == null ? null : next.deepCopy());
}
//Iteratively copy the linked list headed by this Entry (recommended for big lists)
// Entry deepCopy(){
// Entry result = new Entry(key, value, next);
// for(Entry p = result; p.next != null; p = p.next)
// p.next = new Entry(p.next.key, p.next.value, p.next.next);
// return result;
// }
}
}
"final" Schlüsselwörter müssen eventuell entfernt werden
Um eine Klasse "cloneable" zu machen, kann es manchmal notwendig sein, von einigen Feldern die "final" Schlüsselwörter zu entfernen.