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

时间:2013-12-10 15:36:51

标签: java constructor static enums

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

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 个答案:

答案 0 :(得分:23)

编译器允许调用静态函数,因为它不够智能而无法禁止它:如果不查看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在初始化之前对静态字段进行了修改。

这是demo of this code on ideone