编译器禁止访问枚举构造函数中的静态字段。下面的源代码有效,它使用静态字段:
public enum TrickyEnum
{
TrickyEnum1, TrickyEnum2;
static int count;
TrickyEnum()
{
incrementCount();
}
private static void incrementCount()
{
count++;
}
public static void main(String... args)
{
System.out.println("Count: " + count);
}
}
输出:
数:2。
但是,尽管差异很小,但下面的代码不起作用:
public enum TrickyEnum
{
TrickyEnum1, TrickyEnum2;
static int count;
TrickyEnum()
{
count++; //compiler error
}
public static void main(String... args)
{
System.out.println("Count: " + count);
}
}
从我的搜索中,人们通常声称问题是由于静态字段的初始化顺序造成的。但是第一个例子是有效的,那么为什么Java开发人员会禁止第二个例子呢?它也应该有用。
答案 0 :(得分:23)
编译器允许调用静态函数,因为它不够智能而无法禁止它:如果不查看incrementCount
方法的主体,就无法推断出调用的合法性。
运行以下代码时,禁止此操作的原因很明显:
enum TrickyEnum
{
TrickyEnum1, TrickyEnum2;
static int count = 123; // Added an initial value
TrickyEnum()
{
incrementCount();
}
private static void incrementCount()
{
count++;
System.out.println("Count: " + count);
}
public static void showCount()
{
System.out.println("Count: " + count);
}
}
public static void main (String[] args) throws java.lang.Exception
{
TrickyEnum te = TrickyEnum.TrickyEnum1;
TrickyEnum.showCount();
}
打印
1
2
123
这对于阅读代码的程序员来说非常困惑:基本上,incrementCount
在初始化之前对静态字段进行了修改。