为什么不允许从enum的构造函数中引用static变量?

为什么不允许从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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值