为什么不允许从enum的构造函数中引用static变量?
url:http://hi.baidu.com/turt_ed___/blog/item/622fb2084dda1235e924888d.html
"Cannot refer to the static enum field XX within an initializer."
从enum的构造函数、实例初始化块或者实例变量的初始化表达式中引用本enum中定义的static变量,会出现如上的编译时异常。 例如: enum E { E1, E2; static Object obj = new Object(); { // obj = new Object(); compile-error } // Object obj1 = obj; compile-error private E() { // obj = new Object(); compile-error } } 那么,为什么会有这样的限制呢? 在编译时,编译器会按枚举常量(E1,E2)的顺序自动生成两个static final的常量,类似与如下代码。 // Field descriptor #6 LE; public static final enum E E1 = new E(); // Field descriptor #6 LE; public static final enum E E2 = new E(); // Field descriptor #9 Ljava/lang/Object; static java.lang.Object obj = new Object(); 这会导致E的实例初始化代码在static变量obj初始化之前运行了,所以E的实例初始化代码引用这样的变量时可能出现空指针。 下面的代码演示了这种情况: class A { public static final A a = new A(); private static Object obj = new Object(); public static final A b = new A(); public A() { System.out.println(this + ":" + obj); } } public class Main { public static void main(String[] args) { new A(); } } 上面的代码第一次打印obj时总是为null: A@10b62c9:null A@82ba41:java.lang.Object@923e30 A@130c19b:java.lang.Object@923e30 |