Для класса, чьи поля являются исключительно примитивно, напр .:Переопределение hashCode() - это достаточно хорошо?
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;
}
}
Является ли это разумно «достаточно хорошо» способ писать hashCode()
?
boolean hashCode()
{
return (b + a + c + d).hashCode();
}
То есть, я построить String
из одних и тех же областях, что equals()
использования, а затем просто использовать String#hashCode()
.
Редактировать: Я обновил свой вопрос, чтобы включить поле long
. Как следует обрабатывать long
в hashCode()
? Просто позвольте этому переполнению int
?
Хотя он не очень эффективен, он должен работать нормально, потому что любые два экземпляра со всеми одинаковыми внутренними значениями будут иметь один и тот же хэш-код. – Gabe
Он будет работать правильно, я не знаю о проблеме с производительностью, но он, безусловно, будет работать. Если вы хотите пойти дальше, прочитайте: http://www.ibm.com/developerworks/java/library/j-jtp05273.html – Necronet
Просто используйте [honsCodeBuilder] commons-lang] (http://commons.apache.org/ lang/api-2.5/org/apache/commons/lang/builder/HashCodeBuilder.html) и никогда не придется беспокоиться об этом типе –