通常我已经知道在编译期间首先执行Java类中的static
块/初始化。但是试图访问enum
内的静态字段会给我错误
无法在初始值设定项中引用静态枚举字段
ExportToReports.Animal.num
。
为什么会发生此错误,因为静态变量必须已初始化?
public enum Animal{
cat(2), dog(3);
int id, number;
static int num = 5;
Animal(int id)
{
this.id = id;
this.number = Animal.num;
}
}
这是否意味着当涉及枚举静态块时,不会先执行?请解释
答案 0 :(得分:3)
一个简单的解决方法是将静态字段放在静态内部类中:
enum Foo{
RED,GREEN,BLUE;
private final int value;
private Foo(){
this.value = ++ Bar.heresMyStaticField;
}
static class Bar{
private static int heresMyStaticField;
}
}
你是否这样做是完全不同的问题。
答案 1 :(得分:2)
第一次加载类时会发生静态初始化。作为枚举的cat
和dog
会进行静态处理以进行初始化,并首先进行初始化(因为它们在num
上方声明)。初始化它们时,必须已初始化其构造函数中的任何引用。您可以通过声明num
字段final在编译时初始化num来完成此工作:
final static int num = 5;
如果num
需要在初始化后更改值,那么您需要将其从枚举中移出并转移到另一个类。