2I002
EGALITÉ ENTRE OBJETS, CLONAGE D’OBJET
Vincent Guigue & Christophe Marsala
Problématique
Le signe = se comporte de manière spécifique avec les objets...
Le signe == également spécifique avec les objets...
Vocabulaire (uniquement pour les opérations sur objets) new Instanciation / Création d’instance
= Création de référence
== Egalité référentielle
double x = 1 double y = 2
Point Point p
1 P o i n t p = new P o i n t ( 1 , 2 ) ;
2 P o i n t q = p ;
3 P o i n t r = new P o i n t ( 1 , 2 ) ;
4 S y s t e m . o u t . p r i n t l n ( ( p==q ) +" ␣ " + ( p==r ) ) ;// t r u e f a l s e
Problématique
Le signe = se comporte de manière spécifique avec les objets...
Le signe == également spécifique avec les objets...
Vocabulaire (uniquement pour les opérations sur objets) new Instanciation / Création d’instance
= Création de référence
== Egalité référentielle
double x = 1 double y = 2
Point Point p
Point q
1 P o i n t p = new P o i n t ( 1 , 2 ) ;
2 P o i n t q = p ;
3 P o i n t r = new P o i n t ( 1 , 2 ) ;
4 S y s t e m . o u t . p r i n t l n ( ( p==q ) +" ␣ " + ( p==r ) ) ;// t r u e f a l s e
Problématique
Le signe = se comporte de manière spécifique avec les objets...
Le signe == également spécifique avec les objets...
Vocabulaire (uniquement pour les opérations sur objets) new Instanciation / Création d’instance
= Création de référence
== Egalité référentielle
double x = 1 double y = 2
Point
Point p
Point q double x = 1
double y = 2
PointPoint r
1 P o i n t p = new P o i n t ( 1 , 2 ) ;
2 P o i n t q = p ;
Comment dupliquer une instance?
Idée (assez raisonnable somme toute)
Créer une nouvelle instance dont les valeurs des attributs sont identiques Exemple de code : clonage de Point
1 // Ou p l a c e r l e c o d e ?
2 p u b l i c c l a s s P o i n t {
3 // Q u e l l e s i g n a t u r e de methode ?
4 p u b l i c P o i n t c l o n e ( ) {
5 r e t u r n new P o i n t ( x , y ) ;
6 }
7 }
Usage:
1 // main
2 P o i n t p = new P o i n t ( 1 , 2 ) ;
3 P o i n t p2 = p . c l o n e ( ) ;
NB: construction de nouvelle instance sans
newexplicite dans le
mainComment dupliquer une instance?
Idée (assez raisonnable somme toute)
Créer une nouvelle instance dont les valeurs des attributs sont identiques Exemple de code : clonage de Point
1 // Ou p l a c e r l e c o d e ?
2 p u b l i c c l a s s P o i n t {
3 // Q u e l l e s i g n a t u r e de methode ?
4 p u b l i c P o i n t c l o n e ( ) {
5 r e t u r n new P o i n t ( x , y ) ;
6 }
7 }
Usage:
1 // main
2 P o i n t p = new P o i n t ( 1 , 2 ) ;
3 P o i n t p2 = p . c l o n e ( ) ;
NB: construction de nouvelle instance sans
newexplicite dans le
mainComment dupliquer une instance?
Idée (assez raisonnable somme toute)
Créer une nouvelle instance dont les valeurs des attributs sont identiques Exemple de code : clonage de Point
1 // Ou p l a c e r l e c o d e ?
2 p u b l i c c l a s s P o i n t {
3 // Q u e l l e s i g n a t u r e de methode ?
4 p u b l i c P o i n t c l o n e ( ) {
5 r e t u r n new P o i n t ( x , y ) ;
6 }
7 }
Usage:
1 // main
2 P o i n t p = new P o i n t ( 1 , 2 ) ;
3 P o i n t p2 = p . c l o n e ( ) ;
Clonage : syntaxe alternative
Avant le JAVA, il y avait le C++
En C++ : la syntaxe standard = constructeur de copie Exemple de code dans la classe Point
1 // C o n s t r u c t e u r de P o i n t a p a r t i r d ’ un a u t r e P o i n t
2 p u b l i c P o i n t ( P o i n t p ) {
3 t h i s. x = p . x ; // t h i s f a c u l t a t i f
4 t h i s. y = p . y ; // t h i s f a c u l t a t i f
5 }
Usage:
1 P o i n t p = new P o i n t ( 1 , 2 ) ;
2 P o i n t p2 = new P o i n t ( p ) ;
Résultat ABSOLUMENT identique (depuis JAVA 1.5)
Avantage du clone en JAVA: il s’agit d’une méthode standard (= + facile à lire)
Comment tester l’égalité structurelle?
Créer une méthode qui teste l’égalité des attributs Solution 1 (simple mais pas utilisée)
1 // Dans l a c l a s s e P o i n t
2 p u b l i c b o o l e a n e g a l i t e ( P o i n t p ) {
3 r e t u r n p . x == x && p . y == y ;
4 }
5 // e q u i v a l e n t s i m p l i f i e de
6 // i f ( p . x == x && p . y == y )
7 // r e t u r n t r u e
8 // e l s e
9 // r e t u r n f a l s e ;
1 // Dans l e main
2
3 P o i n t p1 = new P o i n t ( 1 . , 2 . ) ;
4 P o i n t p2 = p1 ;
5 P o i n t p3 = new P o i n t ( 1 . , 2 . ) ;
6 P o i n t p4 = new P o i n t ( 1 . , 3 . ) ;
7
8 p1 . e g a l i t e ( p2 ) ; // t r u e
9 p1 . e g a l i t e ( p3 ) ; // t r u e
10 p1 . e g a l i t e ( p4 ) ; // f a l s e
public boolean egalite(Point p) produit le résultat attendu ATTENTION à la signature:
la méthode retourne un booléen
la méthode ne prend qu’un argument
Méthode standard: boolean equals(Object o)
equals existe dans tous les objets (comme toString)
mais teste l’égalité référentielle... Pas intéressant (comme toString)
⇒ Redéfinition = faire en sorte de tester les attributs Un processus en plusieurs étapes:
1
Vérifier s’il y a égalité référentielle / pointeur null
2
Vérifier le type de l’Object o (cf cours polymorphisme)
3
Convertir l’Object o dans le type de la classe (idem)
4
Vérifier l’égalité entre attributs
1 p u b l i c b o o l e a n e q u a l s ( O b j e c t o b j ) {
2 i f (t h i s == o b j ) r e t u r n t r u e;
3 i f ( o b j == n u l l) r e t u r n f a l s e;
4 i f ( g e t C l a s s ( ) != o b j . g e t C l a s s ( ) )
5 r e t u r n f a l s e;
6 P o i n t o t h e r = ( P o i n t ) o b j ;
7 i f ( x != o t h e r . x ) r e t u r n f a l s e;
8 i f ( y != o t h e r . y ) r e t u r n f a l s e;
9 r e t u r n t r u e;
10 }