EnumSet<E>
类定义为:
public abstract class EnumSet<E extends Enum<E>>
extends AbstractSet<E>
implements Cloneable, Serializable
在JCF中。
此外,类本身实现的大多数方法都是静态的。最后,该类似乎没有实现add()
,iterator()
,remove()
,size()
,contains()
或isEmpty()
方法,只是继承它们来自AbstractSet,它没有实现它们。
我有两个问题:
EnumSet
个对象进行实例化和使用?add()
方法用于EnumSet
个对象?答案 0 :(得分:16)
您看到的大多数静态方法都是工厂方法(of()
,complementOf()
,allOf()
等。
这些方法返回EnumSet的实例。这些方法创建和返回的EnumSet的实际类型是EnumSet(RegularEnumSet
,JumboEnumSet
)的子类,它们不是公共API的一部分,但实现了所有必需的方法。您需要知道的是他们实现了EnumSet。
答案 1 :(得分:8)
EnumSet本身就是一个抽象类,因此它不必实现它继承的任何抽象方法。它将该责任传递给其非抽象子类。
您可以调用未实现的方法,因为您实际上是在EnumSet的子类的实例上调用它们。 (由于EnumSet是抽象的,因此无法直接实例化。)
答案 2 :(得分:4)
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
关于实施,this链接提供了说明:
EnumSet
是一个抽象类,它提供了两个具体的 实现,java.util.RegularEnumSet
和java.util.JumboEnumSet
。RegularEnumSet
和JumboEnumSet
之间的主要区别在于前者 使用long
变量来存储元素,而稍后使用long[]
来存储元素 存储其元素。由于RegularEnumSet
使用long
变量,因此它是 64位数据类型,它只能容纳那么多元素。这就是原因 当使用EnumSet
方法创建空EnumSet.noneOf()
时,它 如果是密钥Universe(密钥中的枚举实例数),请选择RegularEnumSet
如果关键宇宙是,则枚举)小于或等于64和JumboEnumSet
超过64岁。
这意味着EnumSet
会为您选择正确的实施方式。
答案 3 :(得分:1)
- 如何实例化和使用EnumSet对象?
醇>
EnumSet是一个“抽象类”,当你有一些预先知道的“密钥”时,它比HashSet更受欢迎。例如,当您有配置密钥时。
性能优于 HashSet ,因为“ ...因为枚举常量是唯一的且具有预定义的长度,因为您无法定义新的枚举常量在运行时;它允许Java API设计器高度优化EnumSet ......“(阅读更多:http://javarevisited.blogspot.com/2014/03/how-to-use-enumset-in-java-with-example.html#ixzz3jNcyB8ve)
您可以使用大量工厂方法进行实例化,例如 EnumSet.of(...)
- 为什么我可以对EnumSet对象使用add()方法?
醇>
创建“ EnumSet ”对象后,可以在运行时使用“add”方法添加另一个元素。如果您有一个配置键列表,您可以通过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);
}
}
输出结果为:
[KEY1, KEY2]
[KEY1, KEY2, KEY3]