在枚举中访问静态字段
通常我已经了解到,在编译期间,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;
}
}
那么这是否意味着当涉及到枚举时,静态块不会首先被执行?请解释一下
一个简单的解决方法是将静态字段放入静态内部类中:
enum Foo{
RED,GREEN,BLUE;
private final int value;
private Foo(){
this.value = ++ Bar.heresMyStaticField;
}
static class Bar{
private static int heresMyStaticField;
}
}
你是否应该这样做是一个完全不同的问题。
静态初始化在类首次加载时发生。 cat
与dog
,如枚举,静态处理初始化的目的,首先初始化(因为它们是上述声明num
)。 当它们被初始化时,其构造函数中的任何引用必须已经被初始化。 你可以通过声明在编译时初始化num的num
字段来完成这项工作:
final static int num = 5;
如果num
在初始化之后需要改变值,那么你需要将它从枚举中移出并移到另一个类中。