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的唯一例子。正确的方法是增加静态块中的静态计数器或不创建此计数器。这是多余的,枚举元素可以计数,但我想了解这段代码是怎么回事。这确实是一个有趣的案例。可能是我所想的重复。我想确定:)。谢谢