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

前端之家收集整理的这篇文章主要介绍了为什么Java枚举常量初始化不完整?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我偶然发现了一个非常奇怪的错误,我无法解释为什么会这样.想像下面的枚举:
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;
        }
    }

}

运行这些的结果是:

java.awt.Color[r=100,g=100,b=100]
null

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

Ammendment:
如果将WHY_AM_I_NULL放在枚举中的私有静态类中,那么它将被初始化.

解决方法

问题是所有的静态字段(和枚举实例都是这样计数的)以它们声明的顺序被初始化( specification).所以当CONSTANT2被实例化时,字段WHY_AM_I_NULL仍然没有初始化(因此为空).

由于您无法将该字段放在枚举实例之前,您必须找到一些其他方式来执行所需的操作(例如,将该字段放在枚举类之外).如果你告诉我们,你真的想要完成什么,可以提出进一步的建议.

编辑:如果将WHY_AM_I_NULL置于嵌套类中,则在类首次访问时(即在执行staticMethod2期间,该类的字段)将被初始化.

猜你在找的Java相关文章