Java中的哪个类实现了抽象类EnumSet?

时间:2018-04-24 17:12:13

标签: java enumset

我看到EnumSet.of()返回类型为EnumSet的对象的实例。 但我无法弄清楚哪个类实际实现了这个抽象类?如果没有子类化它,如何获得抽象类型EnumSet的实例?

5 个答案:

答案 0 :(得分:6)

以下是java中的2个扩展EnumSet

的类
1. RegularEnumSet
2. JumboEnumSet

您可以使用EnumSet的静态方法创建实例,例如EnumSet#noneOfEnumSet#allOf等。这实际上会根据条件返回RegularEnumSetJumboEnumSet的实例。 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);
}

答案 1 :(得分:5)

您不直接创建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();
...

答案 2 :(得分:0)

  

与枚举类型一起使用的专用Set实现。枚举集中的所有元素必须来自单个枚举类型,该类型在创建集时显式或隐式指定。

如果EnumSet,您无法创建实例!但是你也不需要扩展它,因为它有一个工厂方法从指定的元素创建一个Set:

public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest)

它会为您创建一个对象。通常EnumSets用于组合效果,无论它是文本样式,例如BOLD AND UNDERLINE或颜色......

enum Color { GREEN, RED, BLUE };
EnumSet <Color> yellow = EnumSet.of(Color.RED, Color.GREEN);

您找到了其他信息here ...

答案 3 :(得分:0)

要查找此信息,您可以查看所有代码,或打印出作为示例返回的对象的getClass(),但更简单的方法是使用您的IDE。

导航至EnumSet,然后点击显示实施的图标

implementations of EnumSet

这将显示可用EnumSet的所有可用子类的列表。

答案 4 :(得分:0)

其他答案已经回答了实际实现抽象类EnumSet的{​​{1}}的具体子类。我将尝试澄清如何在没有子类化的情况下获取抽象类型EnumSet的实例。

观察EnumSet没有构造函数,因此它不能像普通类一样使用:

EnumSet

相反,要创建EnumSet set = new EnumSet(...); // not like this ,我们使用其中一个静态初始值设定项(例如EnumSet)。这些初始值设定项将在内部创建类型为of的对象(如果枚举常量的数量很大)或JumboEnumSet(否则),并返回该对象的引用。

由于RegularEnumSetJumboEnumSet都是RegularEnumSet的子类,因此可以将它们分配给EnumSet类型的变量(这称为widening reference conversion) 。

这样做的好处是,当我们使用EnumSet类型的变量时,我们不必知道我们正在使用哪个具体实现。事实上,EnumSetJumboEnumSet都是包RegularEnumSet中的私有类,因此我们甚至无法直接创建它。

您可以详细了解java.util在内部通过其来源实施的方式(例如,参见here for the Java 9's version)。

Java中常用类型的另一个例子实际上不是具体的类EnumSetStream实际上是一个界面。