枚举 - 静态初始化顺序

Paw*_*wel 3 java enums

java 中禁止访问类static的构造函数中的变量。enum为什么在枚举中静态初始化的顺序没有交换?

正确代码示例:

enum Test
{
    TEST1, TEST2;

    static int x;
}
Run Code Online (Sandbox Code Playgroud)

为什么java的开发者没有创建这样的正确代码:

enum Test
{
    static int x;

    TEST1, TEST2;
}
Run Code Online (Sandbox Code Playgroud)

然后static可以在构造函数中使用变量。现在已被禁止。

有什么原因或者只是他们的设计吗?

Boh*_*ian 5

嗯,这是为了确保安全的实例初始化 - 枚举实例与static final枚举类的实例非常相似,并且语言已定义它们首先被初始化。

但如果您知道一两个技巧,您就可以在枚举构造函数中有效地使用静态变量:

enum Test {
    TEST1, TEST2;

    static class Holder {
        static int x;
    }

    Test() {
        Holder.x++; // no compiler error
    }
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅按需初始化持有者习惯用法