【发布时间】:2016-08-17 16:30:14
【问题描述】:
我明白为什么枚举构造函数不能访问静态字段 和枚举本身内的方法,以及为什么允许这样做 在课堂上。以下面的代码为例,
import java.util.ArrayList;
import java.util.List;
public enum Foo {
A("Some string"),
B("Some other string"),
;
static List<String> list = new ArrayList<>();
Foo(String description) {
list.add(description);
}
}
此代码导致编译时错误,illegal reference to static field from initializer。
相关背景
在静态字段全部完成之前调用枚举构造函数
被初始化。在上面的示例中,这意味着 list 尚未初始化。这是因为静态字段是在文本中初始化的
订购(section 12.4.2)
接下来,执行类变量初始化器和静态 类的初始值设定项,或字段初始值设定项 界面,按文本顺序,就好像它们是一个单独的块一样。
(强调我的)
并且由于枚举值本身总是在任何其他值之前
字段,包括静态字段,它们对
枚举构造函数,即枚举之前不能有静态字段
值A 和B。
问题
但是,这是我的问题,为什么是“私人”(包含在类中)enum
可以访问其封闭类的静态字段,
无论枚举是否出现在 --- 或 --- 之前
在静态字段之后?具体来说,这是在 Java 规范中的什么地方指定的?
参考以下代码
import java.util.ArrayList;
import java.util.List;
public class Bar {
static List<String> first = new ArrayList<>();
enum Baz {
A("Some string"),
B("Some other string"),
;
Baz(String description) {
// Can access static fields from before the enum
first.add(description);
// Can access static fields from _after_ the enum
second.add(description);
}
}
static List<String> second = new ArrayList<>();
}
【问题讨论】:
-
有趣的问题。不过,我不确定您在静态字段初始化之前调用构造函数的假设是否正确。我认为情况恰恰相反。证明类型:stackoverflow.com/questions/36407743/…
-
@SotiriosDelimanolis 实际上枚举常量列表或多或少是使用枚举的构造函数创建的对象列表。
-
@SotiriosDelimanolis 示例已提供,谢谢。很抱歉。