Dla klasy, których pola są wyłącznie prymitywne, np .:Przesłanianie hashCode() - czy to wystarczy?
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;
}
}
Czy to rozsądnie „wystarczająco dobry” sposób napisać hashCode()
?
boolean hashCode()
{
return (b + a + c + d).hashCode();
}
Oznacza to, że skonstruowanie String
z tych samych pól, które equals()
zastosowań, a potem po prostu korzystać String#hashCode()
.
Edytuj: Zaktualizowałem moje pytanie, dodając pole long
. W jaki sposób należy obsługiwać long
w hashCode()
? Po prostu przepuść int
?
Chociaż nie jest strasznie wydajna, powinna działać poprawnie, ponieważ dowolne dwa wystąpienia o tych samych wartościach wewnętrznych będą miały ten sam kod skrótu. – Gabe
Będzie działać poprawnie Nie wiem o problemie wydajności, ale na pewno zadziała. Jeśli chcesz pójść dalej, przeczytaj: http://www.ibm.com/developerworks/java/library/j-jtp05273.html – Necronet
Po prostu użyj [HashCodeBuilder] [commons-lang's HashCodeBuilder] (http://commons.apache.org/ lang/api-2.5/org/apache/commons/lang/builder/HashCodeBuilder.html) i nigdy nie musisz się martwić tego typu sprawami: –