枚举和静态变量在构造函数中
编译器禁止访问枚举构造函数中的静态字段。 下面的源代码工作,它使用一个静态字段:
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开发者禁止第二个例子呢? 它也应该工作。
编译器允许调用一个静态函数,因为它不够聪明以禁止它:调用的合法性无法在不考虑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
在对静态字段进行初始化之前对其进行修改。
这是一个关于ideone的代码演示。
链接地址: http://www.djcxy.com/p/38067.html