Minitutorial - Cloneable: Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
Zeile 6: Zeile 6:
 
Beispiel:
 
Beispiel:
  
public Object clone() throws CloneNotSupportedException {
+
<code=java>public Object clone() throws CloneNotSupportedException {
 
     Object result = super.clone();
 
     Object result = super.clone();
 
     return result;  
 
     return result;  
}
+
}</code=java>
  
 
=Danach sollte sie noch irgendwelche Felder bearbeiten, die zusätzliche Beachtung erfordern=
 
=Danach sollte sie noch irgendwelche Felder bearbeiten, die zusätzliche Beachtung erfordern=
Zeile 17: Zeile 17:
 
Beispiel:
 
Beispiel:
  
public Object clone() throws CloneNotSupportedException {
+
<code=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;  
}  
+
}</code=java>
  
 
=Es kann aber auch notwendig sein, eine "tiefe" Kopie zu erstellen=
 
=Es kann aber auch notwendig sein, eine "tiefe" Kopie zu erstellen=
 
Beispiel:
 
Beispiel:
  
public class MeineKlasse implements Cloneable{
+
<code=java>public class MeineKlasse implements Cloneable{
 
     privates Entry[] buckets = ...;
 
     privates Entry[] buckets = ...;
  
Zeile 56: Zeile 56:
 
//        }
 
//        }
 
     }
 
     }
}
+
}</code=java>
  
 
="final" Schlüsselwörter=
 
="final" Schlüsselwörter=
 
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.

Version vom 10. April 2008, 17:50 Uhr


Alle Klassen, die "Cloneable" implementieren, sollten "public Object clone" überschreiben

Diese "public" Methode sollte zunächst "super.clone()" aufrufen. Beispiel:

<code=java>public Object clone() throws CloneNotSupportedException {

   Object result = super.clone();
   return result; 

}</code=java>

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 einfachten erreichen wir dies, indem wir rekursiv "clone" auf den betreffenden Feldern aufrufen. Beispiel:

<code=java>public Object clone() throws CloneNotSupportedException {

   MeineKlasse result = (MeineKlasse)super.clone();
   result.elements = (Object[]) elements.clone();
   return result; 

}</code=java>

Es kann aber auch notwendig sein, eine "tiefe" Kopie zu erstellen

Beispiel:

<code=java>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;
       //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; // }

   }

}</code=java>

"final" Schlüsselwörter

Um eine Klasse "cloneable" zu machen, kann es manchmal notwendig sein, von einigen Feldern die "final" Schlüsselwörter zu entfernen.