[英]How does java.util.EnumSet<E> work?
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
對象? EnumSet
對象使用add()
方法? 您看到的大多數靜態方法都是工廠方法( 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());
}
}
這打印:
[]
[A]
class java.util.RegularEnumSet
關於實施, 此鏈接提供了說明:
EnumSet
是一個抽象類,它提供了兩個具體的實現,java.util.RegularEnumSet
和java.util.JumboEnumSet
。RegularEnumSet
和JumboEnumSet
之間的主要區別在於前者使用long
變量來存儲元素,而后來使用long[]
來存儲元素。 由於RegularEnumSet
使用long
變量(64位數據類型),因此它只能容納大量元素。 這就是為什么當使用EnumSet.noneOf()
方法創建空EnumSet
時,如果密鑰Universe(密鑰枚舉中的枚舉實例數)小於或等於64,則選擇RegularEnumSet
如果密鑰Universe大於64,則選擇JumboEnumSet
。
這意味着EnumSet
將為您選擇正確的實現。
- 如何實例化和使用EnumSet對象?
EnumSet是一個“抽象類”,當你有一些事先知道的“密鑰”時,它比HashSet更受歡迎。 例如,當您有配置鍵時。
性能優於HashSet,因為“ ...因為Enum常量是唯一的並且具有預定義的長度,因為您無法在運行時定義新的枚舉常量;它允許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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.