簡體   English   中英

java.util.EnumSet如何 <E> 工作?

[英]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繼承它們,而不實現它們。 我有兩個問題:

  1. 如何實例化和使用EnumSet對象?
  2. 為什么我可以為EnumSet對象使用add()方法?

您看到的大多數靜態方法都是工廠方法( of()complementOf()allOf()等)。

這些方法返回EnumSet的實例。 這些方法創建和返回的EnumSet的實際類型是EnumSet( RegularEnumSetJumboEnumSet )的子類,它們不是公共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.RegularEnumSetjava.util.JumboEnumSet RegularEnumSetJumboEnumSet之間的主要區別在於前者使用long變量來存儲元素,而后來使用long[]來存儲元素。 由於RegularEnumSet使用long變量(64位數據類型),因此它只能容納大量元素。 這就是為什么當使用EnumSet.noneOf()方法創建空EnumSet時,如果密鑰Universe(密鑰枚舉中的枚舉實例數)小於或等於64,則選擇RegularEnumSet如果密鑰Universe大於64,則選擇JumboEnumSet

這意味着EnumSet將為您選擇正確的實現。

  1. 如何實例化和使用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(...)

  1. 為什么我可以為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM