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