Java 中的枚举

Sep 11, 2016


写这篇文章的起因是这样的: 我之前一直用的 Color.Red.equals(color) 来判断是不是和枚举类型相等。但是某一天,我看到小组里的一个人直接用==来判断。 我的第一反应就是这不是乱来么!

然后我又想想说不定这样是有道理的,于是就查了一些资料,趁机读了一下 JLS 的枚举这一章。

首先,enum 类的 modifier 不能是 abstract 或者 final

Enum declaration 是隐式final,除非它有至少一个enum constant有 class body.

一个嵌套的 enum 是隐式的 static,这就导致了不能在内部类中声明枚举类型。

枚举类型继承了 Enum

枚举类型不允许实例化,而且采用了三个机制来保证不被实例化:

  • 在 Enum 中把 clone 加上了 final,并在方法里就抛了个异常。
  • 用反射生成实例的时候,enum type 被禁止。
  • 反序列化的时候,有 special treatement.
protected final Object clone() throws CloneNotSupportedException {
    throw new CloneNotSupportedException();
}

Enum Constants

enum 的 body 里都是 enum 的实例,称为enum constants。enum constants 可能跟着一些参数,是用于在类初始化的时候传到构造函数里。

可选的 class body of an enum type 相当于一个匿名函数,不能包含任何构造函数。

因为所有的 constants 只有一份,所以可以用 == 来判断。就算调用 equals,也是调用 super.equals,Enum 里的 equals 就是直接用的 ==。

Enum Body Declarations

Enum body 里的构造器不能是 public 和 protected 的。

声明的构造器是 private 的。

如果不提供构造器,会有一个 private 的默认构造器.

不能有 abstract 的方法,除非所有的枚举常量都实现了这个方法。

enum 不能声明 finalizer 方法,一个枚举类型的实例may never be finalized

Enum Members

每个 enum constant 都是隐式的public static final,按照声明的顺序。

一个 enum constant 被称为创建,在隐式的字段被初始化之后。


(完)