Comparer 2 objets simples avec equals() & hashCode()
Bonjour,
Je souhaite comparer 2 objets ( des livres spécifiés par un titre, auteur, isbn).
J'ai redéfini les méthodes equals et hashCode de la classe Livre :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
public boolean equals(Livre livre) {
if (titre.equalsIgnoreCase(livre.getTitre())
&& auteur.equalsIgnoreCase(livre.getAuteur())
&& isbn == livre.getIsbn())
return true;
else
return false;
}
public int hashCode() {
return titre.hashCode()+auteur.hashCode()+isbn.hashCode();
} |
Cependant, le code suivant échoue à assertEquals(a,b) (j'utilise JUnit) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
public void testLivreEquals() {
Livre a = new Livre("titre","auteur","isbn");
Livre b = new Livre("titre","auteur","isbn");
assertTrue(a.equals(a));
assertTrue(b.equals(b));
assertTrue(a.equals(b));
assertTrue(b.equals(a));
assertEquals(a,b);
LinkedList<Livre> c = new LinkedList<Livre>();
c.add(a);
System.out.println(a.hashCode()+" "+b.hashCode());
assertTrue(c.contains(b));
} |
J'ai vérifié et j'ai bien le même hasCode. La seule différence entre les livres est que j'instancie une LinkedList à la construction du Livre. Cependant, je ne comprend pas pourquoi cette différence est prise en compte alors que j'ai réécris equals() et hashcode() :
Code:
1 2 3 4 5 6 7 8
| public Livre(String titre, String auteur, String numeroISBN) {
this.titre = titre;
this.auteur = auteur;
this.isbn = numeroISBN;
numMedia = compteurMedia++;
listeExemplaire = new LinkedList<Exemplaire>();
} |
Qu'est ce que j'ai oublié ?