Per una classe i cui campi sono esclusivamente primitiva, es .:Overriding hashCode() - è abbastanza buono?
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;
}
}
È questo un ragionevolmente "abbastanza buono" modo per scrivere hashCode()
?
boolean hashCode()
{
return (b + a + c + d).hashCode();
}
Cioè, io costruisco un String
fuori gli stessi campi che equals()
usi, e poi basta usare String#hashCode()
.
Modifica: Ho aggiornato la mia domanda per includere un campo long
. Come deve essere gestito un long
in hashCode()
? Basta lasciarlo traboccare int
?
Anche se non è molto efficiente, dovrebbe funzionare correttamente perché ogni due istanza con tutti gli stessi valori interni avrà lo stesso codice hash. – Gabe
Funzionerà correttamente Non conosco il problema di prestazioni ma sicuramente funzionerà. Se vuoi andare oltre, leggi: http://www.ibm.com/developerworks/java/library/j-jtp05273.html – Necronet
Basta usare [commons-lang's HashCodeBuilder] (http://commons.apache.org/ lang/api-2.5/org/apache/commons/lang/builder/HashCodeBuilder.html) e non preoccuparti mai di questo tipo di cose –