Enum.hashCode
не определен, чтобы возвращать какие-либо конкретные значения (кроме соблюдения правил Object.hashCode
), и общие реализации не делают ничего особенного.
Почему?Если вы использовали перечисления (только) в HashSet
или в качестве ключа в HashMap
, то вместо этого вам следует использовать оптимизированные EnumSet
или EnumMap
.Теперь рассмотрим, будет ли перечисление использоваться вместе с другими типами в HashSet
.Возможно, у вас есть несколько «стандартных опций» для реализации интерфейса, но другие могут прийти со своими опциями.Все безгражданство будет делать.Несколько типов перечислений в одном HashSet
.Если Enum
использовал порядковые числа для значения хеша, то у вас будут общие коллизии.Использование System.identityHashCode
позволяет надежно уменьшить коллизии.
public interface Option {
}
public enum StandardOptions implements Option {
A, B, C
}
enum CustomOptions {
P, Q, R
}
enum MoreOptions {
X, Y, Z
}
Set<Option> options = new HashSet<>();
options.add(A);
options.add(P);
options.add(X);
Мы действительно не хотим A.hashCode() == P.hashCode() == X.hashCode()
.