为什么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: 解决方法
问题是所有的静态字段(和枚举实例都是这样计数的)以它们声明的顺序被初始化(
specification).所以当CONSTANT2被实例化时,字段WHY_AM_I_NULL仍然没有初始化(因此为空).
由于您无法将该字段放在枚举实例之前,您必须找到一些其他方式来执行所需的操作(例如,将该字段放在枚举类之外).如果你告诉我们,你真的想要完成什么,可以提出进一步的建议. 编辑:如果将WHY_AM_I_NULL置于嵌套类中,则在类首次访问时(即在执行staticMethod2期间,该类的字段)将被初始化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |