了解枚举的静态成员初始化

这个问题在这里已经有了答案:

  • 将Enum类型wrt中的静态块的执行顺序返回给构造方法3

  • 枚举的常量是通过调用构造函数初始化的。 这意味着构造函数不能访问该常量,因为此时尚未创建该常量。

    换句话说,假设你有:

    enum MyEnum {
    
       FOO, BAR;
    
       private MyEnum() {
            // Illegal
            // FOO already calls this constructor
            System.out.println(FOO);
       }
    
    }
    

    FOOBAR相当于:

    public static final MyEnum foo;
    public static final MyEnum bar;
    

    当JVM加载枚举类时,通过调用枚举私有构造函数创建FOOBAR ,如下所示:

    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字段时会出现编译时错误。

    链接地址: http://www.djcxy.com/p/38071.html

    上一篇: Understanding enum's static members initialization

    下一篇: Can an enum have a constructors for each of its constants