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

The*_*ris 11 java collections inheritance enums

所述EnumSet<E>类的定义为:

public abstract class EnumSet<E extends Enum<E>>
extends AbstractSet<E>
implements Cloneable, Serializable
Run Code Online (Sandbox Code Playgroud)

在JCF.此外,类本身实现的大多数方法都是静态的.最后,类似乎并没有实现add(),iterator(),remove(),size(),contains()isEmpty()方法,只是继承了他们AbstractSet不执行.我有两个问题:

  1. EnumSet对象如何实例化和使用?
  2. 为什么我可以使用该add()方法的EnumSet对象?

JB *_*zet 16

大多数时候,你看到的静态方法工厂方法(of(),complementOf(),allOf()等).

这些方法返回EnumSet的实例.这些方法创建和返回的EnumSet的实际类型是EnumSet(RegularEnumSet,JumboEnumSet)的子类,它不是公共API的一部分,但实现了所有必需的方法.您需要知道的是他们实现了EnumSet.


meg*_*lop 8

EnumSet本身就是一个抽象类,因此它不必实现它继承的任何抽象方法.它将该责任传递给其非抽象子类.

您可以调用未实现的方法,因为您实际上是在EnumSet的子类的实例上调用它们.(由于EnumSet是抽象的,因此无法直接实例化.)


Vla*_*lad 5

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());
  }
}
Run Code Online (Sandbox Code Playgroud)

这打印:

[]
[A]
class java.util.RegularEnumSet 
Run Code Online (Sandbox Code Playgroud)

关于实现,链接提供了说明:

EnumSet是一个抽象类,它提供了两个具体的实现,java.util.RegularEnumSet并且java.util.JumboEnumSet. RegularEnumSet和的主要区别JumboEnumSet在于前者使用long变量来存储元素,而后者使用 along[]来存储其元素。由于RegularEnumSet使用long变量,它是 64 位数据类型,因此它只能容纳那么多元素。EnumSet这就是为什么当使用方法创建空时EnumSet.noneOf(),它会选择RegularEnumSet键域(键枚举中枚举实例的数量)是否小于或等于 64,以及JumboEnumSet键域是否大于 64。

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