私は非常に奇妙なバグに遭遇し、なぜそれが起こるのか説明できません。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;
}
}
}
結果をあなたがこれを実行します:秒1がヌルである理由
java.awt.Color[r=100,g=100,b=100]
null
質問は、ある次のenumを想像してみ?
Ammendment: あなたが列挙型の内側にプライベート静的クラスでWHY_AM_I_NULLを入れた場合は、それが最初に初期化されます。
は、また新たな観測 –
をAmmended場合メソッドではなく定数を直接使用しようとすると、Eclipseにエラーが表示されます。これは、静的メソッドを使用する場合には当てはまりません。 FindBugsでも問題はありません!私はこれが警告に値すると思う少なくとも –