Мне было интересно, есть ли причина, почему EnumSet реализуется как абстрактный класс и EnumMap реализуется как конкретный класс?
Почему EnumSet реализуется как абстрактный класс, а EnumMap реализуется как конкретный класс?
Ответ 1
EnumSet
имеет две реализации: один для перечислений с 64 или менее элементами (флаги, указывающие наличие значений в наборе, сохраняются как long
), а другой - для других перечислений (флаги хранятся как long[]
), Factory методы EnumSet
возвращают один из них в зависимости от класса перечисления, переданного в.
Такая оптимизация не имеет смысла для EnumMap
(так как в любом случае необходим массив для хранения значений), поэтому EnumMap
- это конкретный класс.
Ответ 2
EnumSet
использует две реализации, RegularEnumSet
и JumboEnumSet
, в зависимости от размера вашего перечисления (64 элемента являются порогом). Методы factory делегируют соответствующую реализацию.
EnumMap
, с другой стороны, работает одинаково для всех типов перечислений (он хранит массив всех элементов перечисления и массив значений одинакового размера), поэтому нет необходимости в абстрактном классе.