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

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

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

上一篇: Enum and static variable in constructor

下一篇: Accessing static fields inside enum