加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:29:22 所属栏目: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(M
我偶然发现了一个非常奇怪的错误,我无法解释为什么会这样.想像下面的枚举:
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期间,该类的字段)将被初始化.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读