【问题标题】:Enum and static variable in constructor构造函数中的枚举和静态变量
【发布时间】:2013-12-28 05:08:39
【问题描述】:

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

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 开发人员禁止第二个示例呢?它也应该可以工作。

【问题讨论】:

  • 你为什么要使用这个计数器?
  • 这只是我更好地了解java的例子。正确的方法是在静态块中增加静态计数器或不创建它。是多余的,枚举元素可以算,但我想了解这段代码是怎么回事。
  • 这确实是一个有趣的案例。

标签: java constructor static enums


【解决方案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 在静态字段被初始化之前对其进行了修改。

这是demo of this code on ideone。

【讨论】:

  • 如我所想。我想确定:)。谢谢。
猜你喜欢
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
相关资源
最近更新 更多