gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:13:00 27 4
gpt4 key购买 nike

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

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);
}
}

输出:

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对静态字段进行修改之前它已被初始化。

这里是 demo of this code on ideone .

关于java - 构造函数中的枚举和静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20498610/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com