构造函数中的枚举和静态变量

2022-09-01 14:40:46

编译器禁止访问枚举构造函数中的静态字段。下面的源代码有效,它使用静态字段:

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开发人员禁止第二个例子呢?它也应该起作用。


答案 1

编译器允许调用静态函数,因为它不够智能,无法禁止它:如果不查看方法的主体,就无法推断出调用的合法性。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上的演示


答案 2

推荐