1. Université Mohamed Chérif Messaâdia
– Souk Ahras –
Département : Faculté des sciences et de technologie
Mathématique et Informatique
Filière : Informatique
Spécialité : Gènie logiciel
Niveau : master 1
Module : TOA
Exposé : CLONAGE d'objets
Professeur : Amirat Présenté par :
TEBIB Med Elamine
PROMOTION : 2015/2016
3. Introduction:
-Dans la programmation orientée objet, il arrive que l'on
doit cloner un objet. Le "clonage" d'un objet pourrait se
définir comme la création d'une copie par valeur de cet
objet.
Dans cet exposé, nous allons voir comment est implémenté
ce concept en Java.
4. Problématique:
-En Java, lorsque vous affectez un objet à un autre, seule
l'adresse mémoire de l'objet est copiée , donc tout
changement sur l'objet original sera reflété dans le nouvel
objet
Myclass obj1 = new Myclass();
Myclass obj2 = obj1;
Dans ce cas, toutes les modifications que vous apportez à
obj1 reflétera dans obj2 et et vice versa.
5. Problématique:
-Si c'est ça ce qu'on veut pas de soucis, mais si on veut pas
que la modification de obj1 sera observable dans l'objet
obj2.
Qu'est ce qu'on doit faire ?ou d'une autre façon comment
peut-on avoir deux versions d'un mème objet susceptibles
d'évouluer différement ?
6. Définitions :
- Le clonage est l'opération de copie d'une instance de classe
afin de créer une nouvelle instance qui contienne les mêmes
informations.
- Pour qu'un objet soit clonable, il faut qu'il implémente
l'interface Cloneable.
7. Définitions :
-Pour qu'un objet soit copiable (clonable), sa classe doit implanter
la méthode clone() de l'interface Cloneable.
-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 implemanter
l'interface Cloneable et redéfinir la méthode clone(). Cette
redéfinition peut se limiter à faire appel à super.clone(); (i.e. la
méthode mère héritée).Celle-ci peut générer l'exception
CloneNotSupportedException.
8. Implémenter le clonage :
class A implements Cloneable
{
int i;
// la methode qui fait le clonage
public Object clone() throws CloneNotSupportedException
{
return super.clone();
}
}
9. Implémenter le clonage :
Class Test {
public static void main(args [] strings)
{
A obj1 = new A();
A obj2 = (A) obj1.clone();
System.out.println(obj1.i);
System.out.println(ob2.i);
}
}
● Ici obj2 a reçu une copie de obj1. Ce sont deux objets différents mais
de même valeur.
● La copie a été réalisée par la méthode public Object clone()
implémentée par A.
10. Clonage Superficiel « shallow copy » :
-En réalité, le clonage par defaut est superficiel .
-Est un copie bit à bit des champs du premier niveau.
Example :
public class A implements Cloneable{
int x=6;
int []T={1,2};
public Object clone() throws CloneNotSupportedException{
return super.clone();
}
public void afficher() {
System.out.println("x ="+this.x);
for (int i = 0; i < this.T.length; i++) {
System.out.println("T["+i+"] = "+T[i]);
}
} }
11. Clonage Superficiel « shallow copy » :
-Passons maintenant au classe Test
public class Test {
public static void main(String[] args) throws CloneNotSupportedException
{
A a = new A();
A b = (A) a.clone();
b.x=5; // on essaye de modifer la valeur de x de l'objet b
b.T[0]=10;// on essaye de modifer les elements de l'objet T de b
a.afficher();
b.afficher();
}
}
13. Clonage Superficiel « shallow copy » :
les resultats :
x =6
T[0] =10
T[1] = 2
-----
x =5
T[0] = 10
T[1] = 2
• L'entier a.x a été copié dans b.x, mais pour le tableau t, c'est la
référence qui a été copiée (non les éléments du tableau.).donc le
clonage superficiel ne copie que les attributs primitifs(les attributs
du premier ordre).
14. Quelle est la solution pour qu'on
puisse cloner mème les attributs
de type référence?
15. Clonage en Profondeur (deep copy):
public class A implements Cloneable
{
int x=6;
int []T={1,2};
public Object clone() throws CloneNotSupportedException
{
A tmp = (A) super.clone();
tmp.T = (int[]) this.T.clone();
return tmp;}
public void afficher()
{ System.out.println("x ="+this.x);
for (int i = 0; i < this.T.length; i++) {
System.out.println("T["+i+"] = "+T[i]);
}
}}
16. Clonage en Profondeur (deep copy):
-Passons maintenant au classe Test
public class Test
{
public static void main(String[] args) throws CloneNotSupportedException
{
A a = new A();
A b = (A) a.clone();
b.x=5; // on essaye de modifer la valeur de x de l'objet b
b.T[0]=10;// on essaye de modifer les elements de l'objet T de b
a.afficher();
b.afficher();
}
}
18. Clonage en Profondeur (deep copy):
les resultats :
x =6
T[0] =1
T[1] = 2
-----
x =5
T[0] = 10
T[1] = 2
19. Conclusion:
- Une fois les détails d'implémentation de clone()
compris, il est facile de créer des objets facilement
duplicables pour produire des copies locales.
-Le rôle de la méthode clone() est de dupliquer un objet
rapidement, en dupliquant la zone mémoire dans laquelle il
se trouve à l'aide d'un processus rapide. Pour cloner un
objet, il suffit donc d'appeler cette méthode, qui nous
renverra une copie conforme de cet objet.