构造枚举值的顺序

时间:2015-10-27 14:46:30

标签: java enums

对构建枚举值的顺序是否有任何保证?

例如,给定

enum MyEnum {
    A,
    B,
    C;

    static List<MyEnum> list = new ArrayList<>();
    MyEnum(){
        list.add(this);
    }
}

list.get(0)==MyEnum.Alist.get(1)==MyEnum.B等,或者不一定是真的吗?

2 个答案:

答案 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);
    }
}