Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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