为什么Java枚举常量初始化不完整?

m_p*_*tor 9 java enums

我偶然发现了一个非常奇怪的错误,我无法解释它为什么会发生.想象一下以下枚举:

import java.awt.Color;

public class test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(MyEnum.CONSTANT1.get());
        System.out.println(MyEnum.CONSTANT2.get());
    }

    private enum MyEnum {
        CONSTANT1(staticMethod1()),
        CONSTANT2(staticMethod2());

        private static final Color WHY_AM_I_NULL = new Color(255, 255, 255);

        private final Color color;

        private MyEnum(Color color) {
            this.color = color;
        }

        public Color get() {
            return color;
        }

        private static Color staticMethod1() {
            return new Color(100, 100, 100);
        }

        private static Color staticMethod2() {
            return WHY_AM_I_NULL;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

运行它时的结果是:

java.awt.Color[r=100,g=100,b=100]
null
Run Code Online (Sandbox Code Playgroud)

问题是,为什么第二个是空的?

修改: 如果你把WHY_AM_I_NULL放在枚举中的私有静态类中,那么它首先被初始化.

Phi*_*ler 13

问题是所有静态字段(以及枚举实例都这样计算)都按其声明的顺序(规范)进行初始化.因此,当CONSTANT2实例化时,该字段WHY_AM_I_NULL仍未初始化(因此null).

由于您无法将字段放在枚举实例之前,因此您必须找到其他方法来执行您想要的操作(例如,将字段放在枚举类之外).如果你告诉我们,你真正想要实现的目标,可以提出进一步的建议.

编辑:如果您放入WHY_AM_I_NULL嵌套类,则只要首次访问该类(即,在执行期间staticMethod2),就会初始化此类的字段.