Java Language metodo clone ()


Esempio

Il metodo clone() è usato per creare e restituire una copia di un oggetto. Questo metodo dovrebbe essere evitato in quanto è problematico e un costruttore di copia o qualche altro approccio per la copia dovrebbe essere usato a favore di clone() .

Per il metodo da utilizzare tutte le classi che chiamano il metodo devono implementare l'interfaccia Cloneable .

L'interfaccia Cloneable stessa è solo un'interfaccia di tag usata per cambiare il comportamento del metodo native clone() che controlla se la classe degli oggetti chiamanti implementa Cloneable . Se il chiamante non implementa questa interfaccia verrà lanciata una CloneNotSupportedException .

La classe Object non implementa questa interfaccia in modo che venga generata una CloneNotSupportedException se l'oggetto chiamante è di classe Object .

Perché un clone sia corretto dovrebbe essere indipendente dall'oggetto da cui viene clonato, quindi potrebbe essere necessario modificare l'oggetto prima che venga restituito. Ciò significa essenzialmente creare una "copia profonda" copiando anche uno qualsiasi degli oggetti mutabili che costituiscono la struttura interna dell'oggetto che viene clonato. Se questo non è implementato correttamente, l'oggetto clonato non sarà indipendente e avrà gli stessi riferimenti agli oggetti mutabili come l'oggetto da cui è stato clonato. Ciò comporterebbe un comportamento inconsistente in quanto eventuali modifiche a quelle in una influenzerebbero l'altra.

class Foo implements Cloneable {
    int w;
    String x;
    float[] y;
    Date z;
    
    public Foo clone() {
        try {
            Foo result = new Foo();
            // copy primitives by value
            result.w = this.w;
            // immutable objects like String can be copied by reference
            result.x = this.x;
            
            // The fields y and z refer to a mutable objects; clone them recursively.
            if (this.y != null) {
              result.y = this.y.clone();
            }
            if (this.z != null) {
              result.z = this.z.clone();
            }
            
            // Done, return the new object
            return result;
            
        } catch (CloneNotSupportedException e) {
            // in case any of the cloned mutable fields do not implement Cloneable
            throw new AssertionError(e);
        }
    }
}