gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:08:16 29 4
gpt4 key购买 nike

我偶然发现了一个非常奇怪的错误,我无法解释它发生的原因。想象一下以下枚举:

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

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

修正案:如果将 WHY_AM_I_NULL 放在枚举内的私有(private)静态类中,那么它会首先被初始化。

最佳答案

问题是所有静态字段(和枚举实例也算在内)都按照它们声明的顺序(specification)初始化。因此,当 CONSTANT2 被实例化时,字段 WHY_AM_I_NULL 仍未初始化(因此 null)。

由于您不能将字段放在枚举实例之前,因此您必须找到其他方式来执行您想要的操作(例如,将字段放在枚举类之外)。如果您告诉我们您真正想要完成的事情,我们可以提出进一步的建议。

编辑:如果您将 WHY_AM_I_NULL 放入嵌套类中,该类的字段将在首次访问该类时立即初始化(即,在本例中在 staticMethod2 执行期间。

关于java - 为什么Java枚举常量初始化不完整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7188358/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com