Почему EnumSet реализован как абстрактный класс, а EnumMap реализован как конкретный класс?

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


person Cheok Yan Cheng    schedule 03.03.2011    source источник


Ответы (2)


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

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

person axtavt    schedule 03.03.2011

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

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

person Sean Patrick Floyd    schedule 03.03.2011