suivant: Classes anonymes
monter: Extension de classes
précédent: la classe Object
  Table des matières
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 :
- l'interface vide Cloneable permet d'écrire une méthode
clone.
- la méthode Object.clone fait une copie simple (elle copie les
différents champs).
En fait, la méthode clone est définie (et protected)
dans Object si elle n'est pas appliquée à un Cloneable,
elle jette l'exception CloneNotSupportedException.
- l'exception CloneNotSupportedException signale que la méthode
clone ne doit pas être invoquée.
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.
suivant: Classes anonymes
monter: Extension de classes
précédent: la classe Object
  Table des matières
Hugues Fauconnier
2002-01-11