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

时间:2015-08-20 08:24:55

标签: java inheritance collections enums

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. 为什么我可以将add()方法用于EnumSet个对象?

4 个答案:

答案 0 :(得分:16)

您看到的大多数静态方法都是工厂方法(of()complementOf()allOf()等。

这些方法返回EnumSet的实例。这些方法创建和返回的EnumSet的实际类型是EnumSet(RegularEnumSetJumboEnumSet)的子类,它们不是公共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.RegularEnumSetjava.util.JumboEnumSet。   RegularEnumSetJumboEnumSet之间的主要区别在于前者   使用long变量来存储元素,而稍后使用long[]来存储元素   存储其元素。由于RegularEnumSet使用long变量,因此它是   64位数据类型,它只能容纳那么多元素。这就是原因   当使用EnumSet方法创建空EnumSet.noneOf()时,它   如果是密钥Universe(密钥中的枚举实例数),请选择RegularEnumSet   如果关键宇宙是,则枚举)小于或等于64和JumboEnumSet   超过64岁。

这意味着EnumSet会为您选择正确的实施方式。

答案 3 :(得分:1)

  
      
  1. 如何实例化和使用EnumSet对象?
  2.   

EnumSet是一个“抽象类”,当你有一些预先知道的“密钥”时,它比HashSet更受欢迎。例如,当您有配置密钥时。

性能优于 HashSet ,因为“ ...因为枚举常量是唯一的且具有预定义的长度,因为您无法定义新的枚举常量在运行时;它允许Java API设计器高度优化EnumSet ......“(阅读更多:http://javarevisited.blogspot.com/2014/03/how-to-use-enumset-in-java-with-example.html#ixzz3jNcyB8ve

您可以使用大量工厂方法进行实例化,例如 EnumSet.of(...)

  
      
  1. 为什么我可以对EnumSet对象使用add()方法?
  2.   

创建“ 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]