gpt4 book ai didi

java - 为什么枚举的构造函数不能访问静态字段?

转载 作者:IT老高 更新时间:2023-10-28 11:30:10 26 4
gpt4 key购买 nike

为什么枚举的构造函数不能访问静态字段和方法?这对于类是完全有效的,但对于枚举是不允许的。

我想要做的是将我的枚举实例存储在静态 map 中。考虑这个允许通过缩写查找的示例代码:

public enum Day {
Sunday("Sun"), Monday("Mon"), Tuesday("Tue"), Wednesday("Wed"), Thursday("Thu"), Friday("Fri"), Saturday("Sat");

private final String abbreviation;

private static final Map<String, Day> ABBREV_MAP = new HashMap<String, Day>();

private Day(String abbreviation) {
this.abbreviation = abbreviation;
ABBREV_MAP.put(abbreviation, this); // Not valid
}

public String getAbbreviation() {
return abbreviation;
}

public static Day getByAbbreviation(String abbreviation) {
return ABBREV_MAP.get(abbreviation);
}
}

这不起作用,因为枚举不允许在其构造函数中使用静态引用。但是,如果作为类实现,它就可以工作:

public static final Day SUNDAY = new Day("Sunday", "Sun");
private Day(String name, String abbreviation) {
this.name = name;
this.abbreviation = abbreviation;
ABBREV_MAP.put(abbreviation, this); // Valid
}

最佳答案

在静态字段全部初始化之前调用构造函数,因为静态字段(包括表示枚举值的那些)按文本顺序初始化,并且枚举值总是在其他字段之前。请注意,在您的类示例中,您没有显示 ABBREV_MAP 的初始化位置 - 如果它是 SUNDAY 之后,则在初始化类时会出现异常。

是的,这有点麻烦,而且可能设计得更好。

但是,根据我的经验,通常的答案是在所有静态初始化程序的末尾有一个 static {} block ,并在那里使用 EnumSet.allOf< 进行所有静态初始化 获取所有值。

关于java - 为什么枚举的构造函数不能访问静态字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/443980/

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