Messages
du sujet
Redéfinition de la méthodes equals |
SylvainITIN2004
Ville : ANGERS
Membre depuis : 19 oct. 2005
Messages : 11
|
26 oct. 2005 à 14:09
Bonjour,
J'aurai besoin d'explications supplémentaires sur les redéfinitions des méthodes de la classe java.lang.Object. Je vais faire plusieurs sujets afin d'améliorer la lisibilité.
public boolean equals(Objet obj) {
if (this.pseudonyme!=null) {
if (obj instanceof Utilisateur) { /*1*/
Utilisateur nouvelUt = (Utilisateur)obj;
return this.pseudonyme.equals (nouvelUt.pseudonyme) /*2*/
}
}
else {
return false;
}
}
Dans cette première méthode ce que je comprend de manière générale:
si je ne fais pas de redéfinition equals, ma méthode equals va comparer les références des deux objets: obj1==obj2. OR ici nous voulons que equals compare les champs pseudonymes de nos objets Utilisateur. c'est pour cela que nous faisons la redéfinition de la méthode.
Ca c ce que j'ai compris et je pense etre dans le vrai.
Dans l'implémentation de cette méthode plusieurs points ne sont pas clairs:
On vérifie que Obj est de type Utilisateur en /*1*/. Quand la condition se vérifie vous caster qd meme l'objet en Utilisateur. Pour qu'elle raison vu que nous venons de nous assurer que Obj est une instance d'utilisateur. Je pense que je mélange certains termes ce qui m'empèche de comprendre.
Est-ce que je peux dire qu'une instance est la même chose qu'un type? ou est ce que la dénomination type est réservé au type primitif?
En /*2*/ on compare nos pseudonyme entre notre utilisateur courant et l'objet passé en paramètre. Ce que je ne comprend pas c nouvelUt.pseudonyme. Pourquoi n'utilisez vous pas la méthode getPseudonyme(). Naturellement c ce que j'aurai fait.
PS: j'ai préféré décomposé mes questions en 3 sujets pour vous laisser le temps de répondre et améliorer la lisibilité. J'espère que ca ne vous dérangera pas. --- Vive JAVA!!!
|
Manu
Ville : Paris / France
Membre depuis : 29 avr. 2003
Messages : 394
|
26 oct. 2005 à 16:09
> J'aurai besoin d'explications supplémentaires sur les redéfinitions des méthodes de la classe java.lang.Object. Je vais faire plusieurs sujets afin d'améliorer la lisibilité.
>
> public boolean equals(Objet obj) {
> if (this.pseudonyme!=null) {
> if (obj instanceof Utilisateur) { /*1*/
> Utilisateur nouvelUt = (Utilisateur)obj;
> return this.pseudonyme.equals (nouvelUt.pseudonyme) /*2*/
> }
> }
> else {
> return false;
> }
> }
>
> Dans cette première méthode ce que je comprend de manière générale:
> si je ne fais pas de redéfinition equals, ma méthode equals va comparer les références des deux objets: obj1==obj2.
> OR ici nous voulons que equals compare les champs pseudonymes de nos objets Utilisateur.
> c'est pour cela que nous faisons la redéfinition de la méthode.
> Ca c ce que j'ai compris et je pense etre dans le vrai.
C'est exactement ça...
> Dans l'implémentation de cette méthode plusieurs points ne sont pas clairs:
> On vérifie que Obj est de type Utilisateur en /*1*/. Quand la condition se vérifie vous caster qd meme l'objet en Utilisateur.
> Pour qu'elle raison vu que nous venons de nous assurer que Obj est une instance d'utilisateur.
Tout simplement parce que l'expression "obj.pseudonyme" ne compile pas car obj étant de classe Object, on ne peut qu'utiliser les méthodes définie dans la classe Object avec une référence de classe Object. Comme la condition "obj instanceof Utilisateur" est vérifiée, on peut caster sans risque obj en une référence nouvelUt de classe Utilisateur, ce qui permet d'utiliser les champs et les méthodes de cette classe dans la suite.
N'oubliez pas aussi que pendant l'exécution, au moment du cast, la JVM vérifie si l'objet désigné par obj est bien dans les faits un objet de classe Utilisateur (la classe citée au moment du new), et c'est pour ça qu'on vérifie dans la condition la classe de l'objet, pour éviter une exception ClassCastException si l'objet est d'une autre classe.
> Est-ce que je peux dire qu'une instance est la même chose qu'un type?
> ou est ce que la dénomination type est réservé au type primitif?
Non. instance = objet et type = type primitif ou classe ou interface
> En /*2*/ on compare nos pseudonyme entre notre utilisateur courant et l'objet passé en paramètre. > Ce que je ne comprend pas c nouvelUt.pseudonyme.
> Pourquoi n'utilisez vous pas la méthode getPseudonyme(). Naturellement c ce que j'aurai fait.
Ici, ça revient au même, mais this.pseudonyme est plus rapide et plus homogène. Il faut comparer this.pseudonyme avec nouvelUt.pseudonyme ou this.getPseudonyme() avec nouvelUt.getPseudonyme(). En tout cas, il vaut mieux être homogène au cas où getPseudonyme() est redéfinie dans une sous classe de Utilisateur ; d'ailleurs, pour éviter ce genre de redéfinition qui peut provoquer des comparaisons bizarres, on marque généralement ce type d'accesseur final.
> PS: j'ai préféré décomposé mes questions en 3 sujets pour vous laisser le temps de répondre et améliorer la lisibilité. J'espère que ca ne vous dérangera pas.
Vous avez bien fait :-) --- Manu (moderator/modérateur)
|
SylvainITIN2004
Ville : ANGERS
Membre depuis : 19 oct. 2005
Messages : 11
|
27 oct. 2005 à 17:58
Merci c'est limpide.
Pour une fois j'ai compris du premier coup :s
LOL --- Vive JAVA!!!
|
Manu
Ville : Paris / France
Membre depuis : 29 avr. 2003
Messages : 394
|
28 oct. 2005 à 14:36
Un petite astuce que je n'ai pas mentionné au passage :
D'après la javadoc de equals http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#equals(java.lang.Object) il faut notamment vérifier que utilisateur.equals(null) renvoie false et bien sûr ne déclenche pas d'exception...
Dans l'implémentation de equals() de la classe Utilisateur, ce test est fait implicitement, car le test "obj instanceof Utilisateur" est faux si obj est null. --- Manu (moderator/modérateur)
|