我正在为我的 Java 1.6 大学类(class)开发一个 LALG 编译器。所以我上了类型课和语法课。
枚举类型
public enum EnumTypes {
A("OLA"),
B("MUNDO"),
C("HELLO"),
D("WORLD"),
/**
* The order below is reversed on purpose.
* Revert it and will you get a NULL list of types furder.
*/
I(EnumGrammar.THREE),
H(EnumGrammar.TWO),
F(EnumGrammar.ONE),
E(EnumGrammar.ZERO);
private String strValue;
private EnumGrammar enumGrammarValue;
private EnumTypes(String strValue) {
this.strValue = strValue;
}
private EnumTypes(EnumGrammar enumGrammarValue) {
this.enumGrammarValue = enumGrammarValue;
}
public String getStrValue() {
return strValue;
}
public EnumGrammar getEnumTiposValue() {
return enumGrammarValue;
}
}
枚举语法
public enum EnumGrammar {
ZERO(EnumTypes.A,EnumTypes.B,EnumTypes.F,EnumTypes.D),
ONE(EnumTypes.C),
TWO(EnumTypes.B,EnumTypes.H),
THREE(EnumTypes.D,EnumTypes.A,EnumTypes.C);
private EnumTypes[] values;
private EnumGrammar(EnumTypes ... values) {
this.values = values;
}
public EnumTypes[] getValues() {
return values;
}
}
当我调用 EnumTypes.E.getEnumTiposValue().getValues()
时,EnumTypes.F
的值应该是 NULL .
主要
public class Main {
public static void main(String[] args) {
//prints [A, B, null, D]
System.out.println(Arrays.toString(EnumTypes.E.getEnumTiposValue().getValues()));
}
}
有解决方法或类似的方法吗?
谢谢!
最佳答案
本质上,在类完全构造之前,即在构造函数完成之前,允许对对象的引用离开类总是一件非常冒险的事情。枚举是单例。这里有两个类,它们的构造函数以循环依赖的方式接收彼此的实例。此外,类加载是惰性的,因此将加载类并创建枚举实例,最终结果取决于枚举的初始化顺序,这听起来很合理。
我现在无法从 JLS 中引用相应的点(我会寻找它),但我相信如果您允许对对象的引用从构造函数外部“离开类”(这会发生这里由于枚举是由 JVM 初始化的单例),JVM 可以自由地做一些奇怪的事情。
编辑:JLS 的这些要点对案例很重要:
关于java - 枚举的枚举为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38435168/