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
    将为您选择正确的实现

  • 枚举集对象是如何实例化和使用的
  • 枚举集是一个“抽象类”,当您有许多事先已知的“键”时,它比哈希集更受欢迎。例如,当您具有配置密钥时

    性能优于哈希集,因为“…由于枚举常量是唯一的,并且具有预定义的长度,因此无法在运行时定义新的枚举常量;它允许Java API设计器高度优化枚举集…”(详细信息:)

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

  • 为什么我可以对EnumSet对象使用add()方法
  • 创建“EnumSet”对象后,可以在运行时使用“add”方法添加另一个元素。例如,如果您有一个配置键列表,您可以通过枚举来表示,设置“选定”键并在运行时添加它们

    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]