Pour une classe dont les champs sont uniquement primitifs, ex .:Overriding hashCode() - est-ce suffisant?
class Foo
{
int a;
String b;
boolean c;
long d;
boolean equals(Object o)
{
if (this == o) return true;
if (!(o instanceof Foo)) return false;
Foo other = (Foo) o;
return a == other.a && b.equals(other.b) && c == other.c && d = other.d;
}
}
Est-ce une façon raisonnable « assez bon » pour écrire hashCode()
?
boolean hashCode()
{
return (b + a + c + d).hashCode();
}
C'est, je construis un String
sur les mêmes champs que equals()
utilisations, puis il suffit d'utiliser String#hashCode()
. J'ai modifié ma question pour inclure un champ long
. Comment traiter un long
dans hashCode()
? Laissez-le simplement déborder int
?
Bien qu'il ne soit pas très efficace, il devrait fonctionner correctement car deux instances ayant toutes les mêmes valeurs internes auront le même code de hachage. – Gabe
Cela fonctionnera correctement je ne sais pas sur le problème de performance à ce sujet, mais il va certainement fonctionner. Si vous voulez aller plus loin, lisez: http://www.ibm.com/developerworks/java/library/j-jtp05273.html – Necronet
Utilisez simplement [HashCodeBuilder de commons-lang] (http://commons.apache.org/ lang/api-2.5/org/apache/commons/lang/builder/HashCodeBuilder.html) et ne jamais avoir à se soucier de ce genre de chose –