【发布时间】:2011-11-10 08:13:36
【问题描述】:
可能重复:
Java Enums: Two enum types, each containing references to each other?
在我们的代码中,我们得到了一些关于枚举的奇怪 NPE。当我搜索时,我发现(或多或少)以下案例:
public class EnumTest {
public static void main(final String[] args){
System.out.println("------ START ----- ");
System.out.println("BeezleBubs FOO's rockSteady is: " + BeezleBub.FOO.rockSteady);
System.out.println("RockSteady BAR's beezleBub is: " + RockSteady.BAR.beezleBub);
System.out.println("------ END ----- ");
}
public enum RockSteady {
BAR(BeezleBub.FOO);
public final BeezleBub beezleBub;
private RockSteady(final BeezleBub beezleBub) {
this.beezleBub = beezleBub;
System.out.println("Constructing RockSteady, beezleBub = " + beezleBub);
}
}
public enum BeezleBub {
FOO(RockSteady.BAR);
public final RockSteady rockSteady;
private BeezleBub(final RockSteady rockSteady) {
this.rockSteady = rockSteady;
System.out.println("Constructing BeezleBub, rockSteady = " + rockSteady);
}
}
}
由于某种原因,结果很尴尬。运行时,此测试输出:
------ START -----
Constructing RockSteady, beezleBub = null
Constructing BeezleBub, rockSteady = BAR
BeezleBubs FOO's rockSteady is: BAR
RockSteady BAR's beezleBub is: null
------ END -----
另一件事是,当您切换调用枚举的 System.out.prinln() 语句时,枚举的初始化也会发生变化。结果:
------ START -----
Constructing BeezleBub, rockSteady = null
Constructing RockSteady, beezleBub = FOO
RockSteady BAR's beezleBub is: FOO
BeezleBubs FOO's rockSteady is: null
------ END -----
有人对正在发生的事情有清楚的解释吗?它与状态和秩序有关,但我不能完全确定它......
【问题讨论】:
-
嗯,同意这个骗局... :)
标签: java static enums initialization