为什么这个枚举会编译?
我想创建一个每个常量都有一个与之关联的位置。我通过为每个常量指定一个实例初始值设定项来实现此目的,如下所示:enum
Map
import java.util.HashMap;
import java.util.Map;
public enum Derp {
FOO {{
mMap.put("bar", 1);
}};
// cannot be private
protected final Map<String, Integer> mMap = new HashMap<>();
}
我发现如果是,它不能在实例初始值设定项中引用。错误为 。在我遇到这种情况的原因之前,我查阅了JLS §8.9.2,其中部分内容如下:mMap
private
Cannot make a static reference to the non-static field mMap
对于枚举常量的构造函数、实例初始值设定项块或实例变量初始值设定项表达式,引用枚举常量或声明在 右侧的相同类型的枚举常量,这是一个编译时错误。
e
e
e
我不是通过在 自己的实例中隐式引用 intializer 来打破此规则吗?它是如何编译的?它不仅可以编译,而且在运行时可以正常工作。FOO
FOO
(我突然想到这不可能,因为我隐式创建了一个匿名子类,该子类无法引用其超类中的字段。这本身有点奇怪,因为枚举是隐含的...)mMap
private
private
final