Какой класс в Java реализует абстрактный класс EnumSet?
Я вижу, что EnumSet.of() возвращает экземпляр объекта типа EnumSet. Но я не могу понять, какой класс на самом деле реализует этот абстрактный класс? Как вы можете получить экземпляр абстрактного типа EnumSet, если вы не подклассифицировали его?
5 ответов
Вот 2 класса в Java, который расширяет EnumSet
1. RegularEnumSet
2. JumboEnumSet
Вы можете создать экземпляр, используя статические методы EnumSet, такие как EnumSet#noneOf
, EnumSet#allOf
и т.д., который на самом деле возвращает экземпляр RegularEnumSet
или же JumboEnumSet
в зависимости от состояния. EnumSet#of
внутренние звонки EnumSet#noneOf
Пожалуйста, обратитесь ниже код от Java
чтобы увидеть, как EnumSet#noneOf
работает
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
Enum<?>[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
Вы не создаете напрямую экземпляры EnumSet
, Это делается статическими фабричными методами, такими как:
enum Demo { YES, NO, FILENOTFOUND }
EnumSet<Demo> all = EnumSet.allOf(Demo.class);
EnumSet<Demo> notNo = EnumSet.of(Demo.YES, Demo.FILENOTFOUND);
EnumSet<Demo> none = EnumSet.noneOf(Demo.class);
Результирующие наборы являются изменяемыми, то есть вы можете сделать:
EnumSet<Demo> set = EnumSet.noneOf(Demo.class); // start with an empty set
...
set.add(Demo.YES);
set.remove(Demo.NO);
...
set.clear();
...
Специализированная реализация Set для использования с типами enum. Все элементы в наборе перечислений должны происходить из одного типа перечисления, который указывается, явно или неявно, при создании набора.
Вы не можете создать экземпляр, если EnumSet
! Однако вам также не нужно расширять его, поскольку для этого существует фабричный метод для создания Set из указанных элементов:
public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest)
Это создает объект для вас. Часто EnumSets используются для комбинирования эффектов, будь то текстовые стили, например, BOLD и UNDERLINE или с цветами...
enum Color { GREEN, RED, BLUE };
EnumSet <Color> yellow = EnumSet.of(Color.RED, Color.GREEN);
Вы нашли дополнительную информацию здесь...
Другие ответы уже ответили, каковы конкретные подклассы EnumSet
которые на самом деле реализуют абстрактный класс EnumSet
, Я попытаюсь уточнить, как мы можем получить экземпляр абстрактного типа EnumSet
, когда мы не подкласс это.
Соблюдайте это EnumSet
не имеет конструктора, поэтому он не предназначен для использования как обычный класс:
EnumSet set = new EnumSet(...); // not like this
Скорее, чтобы создать EnumSet
мы используем один из его статических инициализаторов (таких как of
). Эти инициализаторы внутренне создадут объект типа JumboEnumSet
(если число констант enum велико) или RegularEnumSet
(в противном случае) и вернуть ссылку на этот объект.
поскольку JumboEnumSet
а также RegularEnumSet
оба подклассы EnumSet
они могут быть назначены переменной типа EnumSet
(это называется расширением конверсии ссылок).
Прелесть этого в том, что когда мы используем переменную типа EnumSet
нам не нужно знать, какую конкретную реализацию мы используем. На самом деле, оба JumboEnumSet
а также RegularEnumSet
оба частного класса в пакете java.util
поэтому мы не можем даже создать его напрямую.
Вы можете узнать больше, как EnumSet
реализован внутри через его источник (см., например, здесь для версии Java 9).
Другим примером часто используемого типа в Java, который на самом деле не является конкретным классом, является Stream
, Stream
на самом деле интерфейс.
Чтобы найти эту информацию, вы можете посмотреть весь код или распечатать getClass()
объекта, возвращенного в качестве образца, но более простым способом является использование вашей IDE.
Перейдите к EnumSet
и щелкните значок, показывающий реализации
Здесь показан список всех доступных подклассов EnumSet.