Какой класс в 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

Здесь показан список всех доступных подклассов EnumSet.

Другие вопросы по тегам