У меня есть класс, который содержит разные перечисления (разные типы). Этот класс используется как ключ для HashMap
. В настоящее время классы hashCode реализуются следующим образом:
public static class Key implements Comparable<Key> {
final int a;
final Enum1 enum1;
final Enum2 enum2;
@Override
public int hashCode() {
return a ^ enum1.hashCode() ^ enum2.hashCode();
}
// ... definition of equals and toString ...
}
Теперь, если enums hashCode просто вернет индекс значения enum в определении перечисления, это не будет оптимальным (слишком много столкновений). Определение метода для Enum.hashCode()
таково:
/**
* Returns a hash code for this enum constant.
*
* @return a hash code for this enum constant.
*/
public final int hashCode() {
return super.hashCode();
}
Предполагая, что это делегированные Object.hashCode()
, все должно быть хорошо, потому что для каждой константы перечисления существует только один экземпляр, а Object.hashCode()
теоретически будет чем-то вроде целого, полученного из внутреннего адреса объекта. Я прав?
PS: Конечно, вам придется использовать что-то более сложное, если один и тот же перечисление используется несколько раз в ключе.