Java 中的哪个 class 实现了抽象 class EnumSet?
Which class in Java implements the abstract class EnumSet?
我看到 EnumSet.of() returns 类型 EnumSet 对象的一个实例。
但是我无法弄清楚哪个 class 实际实现了这个抽象 class?如果没有子class编辑它,如何获得抽象类型 EnumSet 的实例?
这是 java 中的 2 类,它扩展了 EnumSet
1. RegularEnumSet
2. JumboEnumSet
您可以使用 EnumSet 的静态方法创建实例,例如 EnumSet#noneOf
、EnumSet#allOf
等。实际上 returns 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();
...
A specialized Set implementation for use with enum types. All of the elements in an enum set must come from a single enum type that is specified, explicitly or implicitly, when the set is created.
如果EnumSet
,则无法创建实例!但是你也不需要扩展它,因为它的目的是有一个工厂方法来从指定的元素创建一个集合:
public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest)
它为你创建了一个对象。 EnumSets 通常用于组合效果,无论是文本样式,例如粗体和下划线或带有颜色...
enum Color { GREEN, RED, BLUE };
EnumSet <Color> yellow = EnumSet.of(Color.RED, Color.GREEN);
您找到了更多信息here...
要查找此信息,您可以查看所有代码,或打印出作为示例返回的对象的 getClass()
,但更简单的方法是使用您的 IDE。
导航至 EnumSet
并单击显示实施的图标
这会向您显示所有可用的 sub-classes 可用 EnumSet 的列表。
其他答案已经回答了实际实现抽象 class EnumSet
的 EnumSet
的具体子 class 是什么。我将尝试阐明当我们没有对它进行子class编辑时如何获得抽象类型 EnumSet
的实例。
观察到 EnumSet
没有构造函数,因此不能像普通的 class:
那样使用
EnumSet set = new EnumSet(...); // not like this
相反,为了创建一个 EnumSet
,我们使用它的一个静态初始值设定项(例如 of
)。这些初始化程序将在内部创建一个 JumboEnumSet
(如果枚举常量的数量很大)或 RegularEnumSet
(否则)类型的对象,以及 return 该对象的引用。
由于 JumboEnumSet
和 RegularEnumSet
都是 EnumSet
的子class,它们可以赋给 EnumSet
类型的变量(这是称为 widening reference conversion)。
这样做的美妙之处在于,当我们使用EnumSet
类型的变量时,我们不必知道我们使用的是哪个具体实现。事实上,JumboEnumSet
和RegularEnumSet
在包java.util
中都是私有的class,所以我们甚至不能直接创建它。
您可以探索更多 EnumSet
是如何通过其源代码在内部实现的(例如,参见 here for the Java 9's version)。
Java 中常用类型的另一个示例 class 实际上不是具体的 class 是 Stream
。 Stream
其实就是一个接口。
我看到 EnumSet.of() returns 类型 EnumSet 对象的一个实例。 但是我无法弄清楚哪个 class 实际实现了这个抽象 class?如果没有子class编辑它,如何获得抽象类型 EnumSet 的实例?
这是 java 中的 2 类,它扩展了 EnumSet
1. RegularEnumSet
2. JumboEnumSet
您可以使用 EnumSet 的静态方法创建实例,例如 EnumSet#noneOf
、EnumSet#allOf
等。实际上 returns 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();
...
A specialized Set implementation for use with enum types. All of the elements in an enum set must come from a single enum type that is specified, explicitly or implicitly, when the set is created.
如果EnumSet
,则无法创建实例!但是你也不需要扩展它,因为它的目的是有一个工厂方法来从指定的元素创建一个集合:
public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest)
它为你创建了一个对象。 EnumSets 通常用于组合效果,无论是文本样式,例如粗体和下划线或带有颜色...
enum Color { GREEN, RED, BLUE };
EnumSet <Color> yellow = EnumSet.of(Color.RED, Color.GREEN);
您找到了更多信息here...
要查找此信息,您可以查看所有代码,或打印出作为示例返回的对象的 getClass()
,但更简单的方法是使用您的 IDE。
导航至 EnumSet
并单击显示实施的图标
这会向您显示所有可用的 sub-classes 可用 EnumSet 的列表。
其他答案已经回答了实际实现抽象 class EnumSet
的 EnumSet
的具体子 class 是什么。我将尝试阐明当我们没有对它进行子class编辑时如何获得抽象类型 EnumSet
的实例。
观察到 EnumSet
没有构造函数,因此不能像普通的 class:
EnumSet set = new EnumSet(...); // not like this
相反,为了创建一个 EnumSet
,我们使用它的一个静态初始值设定项(例如 of
)。这些初始化程序将在内部创建一个 JumboEnumSet
(如果枚举常量的数量很大)或 RegularEnumSet
(否则)类型的对象,以及 return 该对象的引用。
由于 JumboEnumSet
和 RegularEnumSet
都是 EnumSet
的子class,它们可以赋给 EnumSet
类型的变量(这是称为 widening reference conversion)。
这样做的美妙之处在于,当我们使用EnumSet
类型的变量时,我们不必知道我们使用的是哪个具体实现。事实上,JumboEnumSet
和RegularEnumSet
在包java.util
中都是私有的class,所以我们甚至不能直接创建它。
您可以探索更多 EnumSet
是如何通过其源代码在内部实现的(例如,参见 here for the Java 9's version)。
Java 中常用类型的另一个示例 class 实际上不是具体的 class 是 Stream
。 Stream
其实就是一个接口。