Почему EnumSet реализован как абстрактный класс, а EnumMap реализован как конкретный класс? - PullRequest
24 голосов
/ 03 марта 2011

Мне было интересно, есть ли причина, по которой EnumSet реализован как абстрактный класс, а EnumMap реализован как конкретный класс?

Ответы [ 2 ]

26 голосов
/ 03 марта 2011

EnumSet фактически имеет две реализации - одна для перечислений с 64 или менее элементами (флаги, указывающие на наличие значений в наборе, хранятся как long), а другая для других перечислений (флаги хранятся как long[]). , Методы фабрики EnumSet возвращают один из них в зависимости от переданного класса перечисления.

Такая оптимизация не имеет смысла для EnumMap (поскольку массив для хранения значений необходим в любом случае), поэтому EnumMap - это конкретный класс.

7 голосов
/ 03 марта 2011

EnumSet использует две реализации, RegularEnumSet и JumboEnumSet, в зависимости от размера вашего перечисления (порогом являются 64 элемента).Методы фабрики делегируют к соответствующей реализации.

EnumMap, с другой стороны, работает одинаково для всех типов перечислений (он содержит массив всех элементов перечисления и массив значений одинакового размера), поэтому нет необходимости в абстрактном классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...