了解枚举的静态成员初始化
这个问题在这里已经有了答案:
枚举的常量是通过调用构造函数初始化的。 这意味着构造函数不能访问该常量,因为此时尚未创建该常量。
换句话说,假设你有:
enum MyEnum {
FOO, BAR;
private MyEnum() {
// Illegal
// FOO already calls this constructor
System.out.println(FOO);
}
}
FOO
和BAR
相当于:
public static final MyEnum foo;
public static final MyEnum bar;
当JVM加载枚举类时,通过调用枚举私有构造函数创建FOO
和BAR
,如下所示:
foo = MyEnum(); // name of enum, the params are not relevant
bar = MyEnum();
所以Java不允许你在构造函数中访问该字段,因为它仍处于创建阶段。 您可以运行以下命令来验证:
enum MyEnum {
FOO, BAR;
private MyEnum() {
System.out.println("Initializing");
}
}
public static void main(String[] args) {
System.out.println(MyEnum.FOO);
}
输出:
Initializing
Initializing
FOO
“初始化”会打印两次,一次是通过创建FOO
和一次通过BAR
。
JLS还对枚举说这个:
除非字段是一个常量变量(§4.12.4),否则从构造函数,实例初始值设定项或枚举类型的实例变量初始值设定项表达式引用枚举类型的static
字段时会出现编译时错误。
上一篇: Understanding enum's static members initialization
下一篇: Can an enum have a constructors for each of its constants