java.util.EnumSet如何设置<;E>;工作
java.util.EnumSet如何设置<;E>;工作,java,inheritance,collections,enums,Java,Inheritance,Collections,Enums,EnumSet类定义为: public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E> implements Cloneable, Serializable 公共抽象类枚举集 扩展抽象集 实现可克隆、可序列化 在JCF中。 此外,类本身实现的大多数方法都是静态的。最后,类似乎没有实现add(),iterator(),remove(),size(),contains()或isE
EnumSet
类定义为:
public abstract class EnumSet<E extends Enum<E>>
extends AbstractSet<E>
implements Cloneable, Serializable
公共抽象类枚举集
扩展抽象集
实现可克隆、可序列化
在JCF中。
此外,类本身实现的大多数方法都是静态的。最后,类似乎没有实现add()
,iterator()
,remove()
,size()
,contains()
或isEmpty()
方法,只是从未实现它们的AbstractSet继承它们。
我有两个问题:
EnumSet
对象EnumSet
对象使用add()
方法EnumSet本身是一个抽象类,因此它不必实现它继承的任何抽象方法。它将这一责任传递给它的非抽象子类
您可以调用未实现的方法,因为您实际上是在EnumSet子类的实例上调用它们。(由于EnumSet是抽象的,因此不能直接实例化它本身。)您看到的大多数静态方法都是工厂方法(
of()
,complementOf()
,allOf()
,等等)
这些方法返回EnumSet的一个实例。这些方法创建和返回的枚举集的实际类型是枚举集的子类(RegularEnumSet
,JumboEnumSet
),它不是公共API的一部分,但实现了所有必需的方法。您需要知道的是,它们实现了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());
}
}
这张照片是:
[]
[A]
class java.util.RegularEnumSet
关于实施,link提供了一个描述:
EnumSet
是一个抽象类,它提供了两个具体的
实现,java.util.RegularEnumSet
和java.util.JumboEnumSet
。
RegularEnumSet
和JumboEnumSet
之间的主要区别在于前者
使用long
变量存储元素,而稍后使用long[]
存储元素
存储其元素。因为RegularEnumSet
使用long
变量,这是一个
64位数据类型,它只能容纳那么多元素。这就是为什么
使用EnumSet.noneOf()
方法创建空的EnumSet
时
选择RegularEnumSet
if-key-universe(键中的枚举实例数
Enum)小于或等于64,并且JumboEnumSet
如果密钥范围为
超过64个
这意味着EnumSet
将为您选择正确的实现
package sample.test;
import java.util.EnumSet;
public class Foo {
public enum SimpleConfigEnum { KEY1, KEY2, KEY3};
/**
* Example of EnumSet with add
*/
public static void main(String[] args) {
//Create an enumSet with two elements: KEY1,KEY2
EnumSet<SimpleConfigEnum> eSet = EnumSet.of(SimpleConfigEnum.KEY1, SimpleConfigEnum.KEY2);
System.out.println(eSet);
//... add another element --> KEY3
eSet.add(SimpleConfigEnum.KEY3);
System.out.println(eSet);
}
}
您应该包括EnumSet实现AbstractSet实现的接口。这确保了add()、iterator()、remove()、,。。。在EnumSet的合同中。
[KEY1, KEY2]
[KEY1, KEY2, KEY3]