0% ont trouvé ce document utile (0 vote)
18 vues3 pages

TD Java 6

Le document traite du clonage d'objets en Java, expliquant la nécessité d'implémenter l'interface Clonable et la méthode clone() pour permettre le clonage d'objets. Il distingue entre le clonage superficiel, où seules les références sont copiées, et le clonage en profondeur, qui nécessite de cloner également les objets référencés, comme les tableaux. Des exemples pratiques illustrent ces concepts, notamment avec la classe Cellule et des variations de la méthode clone().

Transféré par

Mohamed Trabelsi
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
18 vues3 pages

TD Java 6

Le document traite du clonage d'objets en Java, expliquant la nécessité d'implémenter l'interface Clonable et la méthode clone() pour permettre le clonage d'objets. Il distingue entre le clonage superficiel, où seules les références sont copiées, et le clonage en profondeur, qui nécessite de cloner également les objets référencés, comme les tableaux. Des exemples pratiques illustrent ces concepts, notamment avec la classe Cellule et des variations de la méthode clone().

Transféré par

Mohamed Trabelsi
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Clonage d'objets

Travaux pratiques en Java


Séance 6: Copies d'objets

Najib Tounsi

1. Le Clonage

2. Simple clonage

3. Clonage en profondeur

1. Le Clonage
Le clonage en général est la création d'un nouvel objet (une instance d'une classe) à partir d'une instance déjà existante. En java
le clonage sert à faire la copie d'un objet dans un autre. En effet, si on se contente d'écrire x = y; on obtient la copie des
références (y sur x), et non la duplication de l'objet y dans x.

Pour qu'un objet soit copiable (clonable), sa classe doit implanter la méthode clone() de l'interface Clonable. En fait, la méthode
clone() est définie pour la classe Object et s'applique donc à tous les objets Java. En pratique, les sous-classes qui le désirent
doivent implanter l'interface Clonable et redéfinir la méthode clone(). Cette redéfinition peut se limiter à faire appel à
[Link](); i.e. la méthode mère héritée. Celle-ci peut générer l'exception CloneNotSupportedException .

2. Simple clonage

Exemple 2.1. Création d'un objet Cellule suivi de son clonage

Soit la classe Cellule, constituée d'un entier et d'un tableau:

class Cellule extends Object implements Cloneable {


// Doit implementer la méthode clone() de l'interface Clonable.
// Methode qui fait le clonage.

// Donnees
int i = 0;
int[] t = {1, 2};

// Méthodes
public Object clone(){
try {
return [Link]();
}
catch (CloneNotSupportedException e){
throw new InternalError();
}
}

public void afficher(){


[Link](i +" "+ t[0]+" "+t[1]);
}
}

Tester cette classe avec:

class TestClone {
public static void main(String args[]){
Cellule x = new Cellule(); // x Objet Cellule
[Link]();
Cellule y = (Cellule) [Link](); // y clone de x
[Link]();
}
}

et constater le résultat:

i=0 t=(1, 2) // valeurs de la cellule x


i=0 t=(1, 2) // valeurs de la cellule y

Remarquer qu'on aurait pu faire une affectation d'objets dans main(). Au lieu de faire

[Link] 1 of 3
Clonage d'objets

Cellule y = (Cellule) [Link](); // initialisation par clonage

On fait

Cellule y = new Cellule();


y = (Cellule) [Link](); // vraie affectation d'un clone

Clonage superficiel.

En réalité, le clonage est superficiel. L'entier x.i a été copié dans y.i, mais pour le tableau t, c'est la référence qui est copiée (non
les éléments du tableau.) Pour le constater, rajouter à la classe Cellule une méthode qui change les éléments d'un cellule.

Exemple 2.2. Rajouter à la classe Cellule la méthode

public void changeMe(){


i = 10;
t[0] = 11;
t[1] = 12;
}

et vérifier qu'en rajoutant dans main() les instructions:

[Link]();
[Link]();
[Link]();

on obtient:

i=10 t=(11, 12) // x change


i=0 t=(11, 12) // y aussi pour la partie tableau (même objet reference)

3. Clonage en profondeur
Pour copier tout l'objet Cellule, y compris le tableau, il faut cloner ce dernier (le copier aussi).

Exemple 3.1. Cloner aussi le tableau.

On change la méthode clone() de la classe Cellule, pour cloner le tableau (le copier aussi).

public Object clone(){


try {
Cellule tmp = (Cellule) [Link]();
tmp.t = (int []) [Link](); //clonage de this.t
return tmp;
}
catch (CloneNotSupportedException e)
{throw new InternalError(); }
}

On crée par clonage une cellule temporaire tmp et on modifie son tableau tmp.t par recopie ( this->[Link]() )

Exercice: le vérifier.

Exemple 3.2. Variation sur le même thème, clonage à la C++

Cette fois-ci, on va copier un à un les éléments d'un objet Cellule sans faire appel à [Link](). On modifie la méthode
clone() de la classe Cellule comme suit.

public Object clone(){ // à la c++, sans clone [Link]()


Cellule tmp = new Cellule();
tmp.i=i;
tmp.t = (int []) [Link](); //clonage de this.t
return tmp;
}

Remarque: on peut tout aussi aussi faire for pour copier les éléments de t (exercice: le faire)

Exemple 3.3. Constructeur Cellule par copie. Façon C++.

On peut créer un constructeur par copie pour la classe Cellule, comme en C++.

[Link] 2 of 3
Clonage d'objets

public Cellule (Cellule x){


this.i = x.i;
for (int i=0; i<2; i++)
this.t[i]=x.t[i];
}

et qu'on peut utiliser par

Cellule x = new Cellule();


...
Cellule y = new Cellule(x); // initialisation par copie

Exercices: Le vérifier. Quelle est la différence par rapport à la méthode clone? (réponse: un constructeur sert à initialiser un
objet nouveau, alors qu'un clonage en Java peut servir aussi à faire des affectations d'objets).

[Link] 3 of 3

Vous aimerez peut-être aussi