我偶然发现了一个非常奇怪的错误,我无法解释为什么会这样.想像下面的枚举:
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期间,该类的字段)将被初始化.