对构建枚举值的顺序是否有任何保证?
例如,给定
enum MyEnum {
A,
B,
C;
static List<MyEnum> list = new ArrayList<>();
MyEnum(){
list.add(this);
}
}
list.get(0)==MyEnum.A
,list.get(1)==MyEnum.B
等,或者不一定是真的吗?
答案 0 :(得分:4)
是
引用JLS section 8.9.3(强调我的):
对于在E声明的主体中声明的每个枚举常量c,E具有隐式声明的类型为E的公共静态最终字段,其与c具有相同的名称。该字段具有由c组成的变量初始值设定项,并使用与c。
相同的注释进行注释在E声明的主体中显式声明的任何静态字段之前,这些字段以与相应的枚举常量相同的顺序隐式声明。
当初始化相应的隐式声明字段时,会产生枚举常量。
旁注,您的代码无法编译,因为您正在访问初始化程序中的静态列表。你可以写一下:
static List<MyEnum> list = new ArrayList<>();
static {
for (MyEnum myEnum : MyEnum.values()) {
list.add(myEnum);
}
// list.get(0) == MyEnum.A, list.get(1) == MyEnum.B
}
答案 1 :(得分:1)
您无法从枚举构造函数访问静态成员,因此您的代码无法编译。
选中此answer
在静态字段全部初始化之前调用构造函数,因为静态字段(包括表示枚举值的字段)按文本顺序初始化,并且枚举值始终位于其他字段之前。
但您可以将逻辑移至static
阻止;
static {
for (MyEnum myEnum : MyEnum.values()) {
list.add(myEnum);
}
}