Java 构造函数中的枚举和静态变量
编译器禁止访问枚举构造函数中的静态字段。下面的源代码有效,它使用了一个静态字段:Java 构造函数中的枚举和静态变量,java,constructor,static,enums,Java,Constructor,Static,Enums,编译器禁止访问枚举构造函数中的静态字段。下面的源代码有效,它使用了一个静态字段: public enum TrickyEnum { TrickyEnum1, TrickyEnum2; static int count; TrickyEnum() { incrementCount(); } private static void incrementCount() { count++; }
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
在静态字段初始化之前对其进行修改
这是一个。为什么要使用这个计数器?这是我更好地了解java的唯一例子。正确的方法是增加静态块中的静态计数器或不创建此计数器。这是多余的,枚举元素可以计数,但我想了解这段代码是怎么回事。这确实是一个有趣的案例。可能是我所想的重复。我想确定:)。谢谢