The*_*ris 11 java collections inheritance enums
所述EnumSet<E>类的定义为:
public abstract class EnumSet<E extends Enum<E>>
extends AbstractSet<E>
implements Cloneable, Serializable
Run Code Online (Sandbox Code Playgroud)
在JCF.此外,类本身实现的大多数方法都是静态的.最后,类似乎并没有实现add(),iterator(),remove(),size(),contains()或isEmpty()方法,只是继承了他们AbstractSet不执行.我有两个问题:
EnumSet对象如何实例化和使用?add()方法的EnumSet对象?JB *_*zet 16
大多数时候,你看到的静态方法工厂方法(of(),complementOf(),allOf()等).
这些方法返回EnumSet的实例.这些方法创建和返回的EnumSet的实际类型是EnumSet(RegularEnumSet,JumboEnumSet)的子类,它不是公共API的一部分,但实现了所有必需的方法.您需要知道的是他们实现了EnumSet.
EnumSet本身就是一个抽象类,因此它不必实现它继承的任何抽象方法.它将该责任传递给其非抽象子类.
您可以调用未实现的方法,因为您实际上是在EnumSet的子类的实例上调用它们.(由于EnumSet是抽象的,因此无法直接实例化.)
import java.util.*;
enum Foo {
A, B
}
class a {
public static void main(String[] args) {
System.out.println(EnumSet.noneOf(Foo.class));
System.out.println(EnumSet.of(Foo.A));
System.out.println(EnumSet.of(Foo.A).getClass());
}
}
Run Code Online (Sandbox Code Playgroud)
这打印:
[]
[A]
class java.util.RegularEnumSet
Run Code Online (Sandbox Code Playgroud)
关于实现,此链接提供了说明:
EnumSet是一个抽象类,它提供了两个具体的实现,java.util.RegularEnumSet并且java.util.JumboEnumSet.RegularEnumSet和的主要区别JumboEnumSet在于前者使用long变量来存储元素,而后者使用 along[]来存储其元素。由于RegularEnumSet使用long变量,它是 64 位数据类型,因此它只能容纳那么多元素。EnumSet这就是为什么当使用方法创建空时EnumSet.noneOf(),它会选择RegularEnumSet键域(键枚举中枚举实例的数量)是否小于或等于 64,以及JumboEnumSet键域是否大于 64。
这意味着将为EnumSet您选择正确的实施方案。
| 归档时间: |
|
| 查看次数: |
1535 次 |
| 最近记录: |