Bonjour à tous,
J'ai voulu utiliser l'interface Comparable dans mon code afin d'identifier et de classer des objets dans un TreeSet.
Les premières lignes de mon implémentation de compareTo(Object o) sont:
if ( this == o) {
return 0;
} else ... <code donnant un entier>
Ma classe est dans un environnement multithread, a tourné pendant des semaines sans soucis. Puis un beau jour, le programme a remonté une erreur assez bizarre me laissant supposer que j'avais 2 fois la même instance dans mon TreeSet...
Après un traquage assez hardu (multithread, héritage, environnement Web, plein de classe) et ce bug qui apparaît/disparaît... je suis arrivé à la conclusion que c'était mon test this==o qui ne renvoyait pas true bien que this et o soit la même instance.
J'ai notamment utilisé hashcode() pour vérifier mes suppositions et cela a régler mon bug:
if ( this.hashCode() == o.hashCode()) {
return 0;
} else if ...
Ceci renvoie toujours true quand this et o sont la même instance alors que le == ne le faisait pas toujours.
Quelqu'un sait-il ce qui se cache derrière == ? est-ce equals ? un code natif inconnu ?
Est-il normal qu'il ne renvoie pas toujours true en multithread ?
Ai-je bien fait de le remplacer par hashcode() ?
Pour info, j'ai quelques blocs static susceptibles de modifier mes instances Comparable... cela peut influer sur equals() à ma connaissance.
Partager