Java Language méthode clone ()


Exemple

La méthode clone() est utilisée pour créer et renvoyer une copie d'un objet. Cette méthode discutable devrait être évitée car elle pose problème et un constructeur de copie ou une autre méthode de copie devrait être utilisée en faveur de clone() .

Pour que la méthode soit utilisée, toutes les classes appelant la méthode doivent implémenter l'interface Cloneable .

L'interface Cloneable elle-même n'est qu'une interface de balise utilisée pour modifier le comportement de la méthode clone() native qui vérifie si la classe d'objets appelants implémente Cloneable . Si l'appelant CloneNotSupportedException pas cette interface, une CloneNotSupportedException sera lancée.

La classe Object elle-même CloneNotSupportedException pas cette interface, donc une CloneNotSupportedException sera lancée si l'objet appelant est de classe Object .

Pour qu'un clone soit correct, il doit être indépendant de l'objet à partir duquel il est cloné. Par conséquent, il peut être nécessaire de modifier l'objet avant qu'il ne soit renvoyé. Cela signifie essentiellement créer une "copie profonde" en copiant également l'un des objets mutables qui constituent la structure interne de l'objet en cours de clonage. Si cela n'est pas implémenté correctement, l'objet cloné ne sera pas indépendant et aura les mêmes références aux objets mutables que l'objet à partir duquel il a été cloné. Cela se traduirait par un comportement incohérent, car toute modification de l'un de ces éléments affecterait l'autre.

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);
        }
    }
}