Ручное умножение значений всех значимых полей-членов, предложенное Gevorg, вероятно, является наиболее эффективным и имеет хорошее распределение значений.Однако, если вы предпочитаете читабельность, есть хорошие альтернативы, доступные либо в Java 7 ...
import java.util.Objects;
...
@Override
public int hashCode() {
return Objects.hash(x, y);
}
..., либо в библиотеке Guava :
import com.google.common.base.Objects;
....
@Override
public int hashCode() {
return Objects.hashCode(x, y);
}
Оба эти метода varags просто делегируют Arrays.hashCode (Object [] a) , так что это оказывает небольшое влияние на производительность из-за автобоксирования int и создания массива ссылок на объекты, но этодолжно быть гораздо менее значимым, чем использование отражения.
И удобочитаемость просто великолепна, поскольку вы просто видите, какие поля используются для вычисления хеш-кода, а весь синтаксис умножения и сложения просто скрыт под капотом Arrays.hashCode(Object[] a)
:
public static int hashCode(Object a[]) {
if (a == null)
return 0;
int result = 1;
for (Object element : a)
result = 31 * result + (element == null ? 0 : element.hashCode());
return result;
}