gpt4 book ai didi

java - 枚举初始值设定项禁止的一些静态类型

转载 作者:搜寻专家 更新时间:2023-11-01 02:02:21 24 4
gpt4 key购买 nike

下面的代码片段,

public enum Main {

INSTANCE;

private final static String STR = "abc";
private final Map<Integer, Character> map = new HashMap<>();

private final static int[] NUMS = { 1, 2, 3 };


private Main() {
for (int i = 0; i < STR.length(); i++)
map.put(NUMS[i], STR.charAt(i)); // compiler error!
}

public char toChar(int i) {
return map.get(i);
}

public static void main(String[] args) {
System.out.println(Main.INSTANCE.toChar(2));
}
}

它产生了下面的编译器错误,

illegal reference to static field NUMS from initializer.

为什么 STR 允许 staticNUMS 不允许?

最佳答案

枚举实例所有其他字段之前被初始化,所以你不能像那样初始化static字段。

但是有一个简单的解决方法!

private static class Holder {
final static int[] NUMS = { 1, 2, 3 };
}

private Main() {
for (int i = 0; i < STR.length(); i++)
map.put(Holder.NUMS[i], STR.charAt(i)); // No compiler error!
}

这是 Initialization-on-demand holder idiom 的示例,它利用了这样一个事实,即内部在类本身被初始化之前被完全初始化,并且 JLS 保证它是线程安全的。

关于java - 枚举初始值设定项禁止的一些静态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42712656/

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