next up previous contents
suivant: Classes anonymes monter: Extension de classes précédent: la classe Object   Table des matières

Clonage

Il faut bien faire attention à ce que les variables sont des références sur des objets, aussi l'affectation ne réalise pas une « copie profonde » : elle ne duplique pas l'objet mais le partage.

Une méthode clone retourne un nouvel objet dont la valeur initiale est une copie de l'état de l'objet auquel la méthode a été appliquée.



transparent
Clonage


// PileInt.java
public class PileInt implements Cloneable{
    private int[] buffer;
    private int top;
    public PileInt(int maxCont){
        buffer = new int[maxCont];
        top = -1;
    }    
    public void empiler(int v){
        buffer[++top] = v;
    }
    public int dépiler(){
        return buffer[top--];
    }
}


transparent
Clone...


// PileInt.java ...
    public Object clone(){
        try{
            PileInt nObj = (PileInt)super.clone();
            nObj.buffer = (int[])buffer.clone();
            return nObj;
        } catch(CloneNotSupportedException e){
            throw new InternalError(e.toString());
        }
    }


Les diverses façons de définir des clones sont les suivantes :

Une classe peut accepter entièrement le clonage, pour cela elle implémente Cloneable et sa déclaration de méthode clone précise qu'elle ne lève pas d'exception. Elle peut aussi laisser passer l'exception CloneNotSupportedException dans certains cas. Elle peut encore ne pas implémenter Cloneable et redéfinir clone de Object ; dans ce cas, le clonage est restreint à la classe et à ses héritiers. Enfin elle peut interdire définitivement le clonage : elle n'implémente pas Cloneable et fournit une méthode clone qui lève toujours CloneNotSupportedException.


next up previous contents
suivant: Classes anonymes monter: Extension de classes précédent: la classe Object   Table des matières
Hugues Fauconnier 2002-01-11