为什么枚举的构造函数不能访问静态字段和方法?这在类中是完全有效的,但在枚举中是不允许的。
我要做的是将我的枚举实例存储在一个静态映射中。考虑下面的示例代码,它允许通过缩写进行查找:
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
}发布于 2009-01-14 17:50:07
构造函数是在所有静态字段都初始化之前调用的,因为静态字段(包括表示枚举值的字段)是按文本顺序初始化的,并且枚举值总是在其他字段之前。请注意,在您的类示例中,您没有显示ABBREV_MAP是在哪里初始化的-如果是在星期天之后,您将在类初始化时得到一个异常。
是的,这是一个有点痛苦,也许可以设计得更好。
然而,在我的经验中,通常的答案是在所有静态初始化器的末尾有一个static {}块,并在那里执行所有静态初始化,使用EnumSet.allOf来获取所有值。
发布于 2011-10-26 19:18:28
引用自JLS, section "Enum Body Declarations"
如果没有这个规则,显然合理的代码会因为枚举类型固有的初始化循环而在运行时失败。(循环存在于任何具有“自类型”静态字段的类中。)下面是一种可能失败的代码示例:
枚举颜色{红,绿,蓝;静态最终颜色,颜色colorMap = Map();colorMap(){ colorMap.put(toString(),Color> );}}
此枚举类型的静态初始化将抛出NullPointerException,因为在运行枚举常量的构造函数时,静态变量colorMap未初始化。上面的限制确保了这样的代码不会编译。
请注意,可以很容易地重构该示例以使其正常工作:
枚举颜色{红,绿,蓝;静态最终颜色,Color> colorMap =新HashMap();静态{(颜色c: Color.values()) colorMap.put(c.toString(),c);}}
重构后的版本显然是正确的,因为静态初始化是从上到下进行的。
发布于 2016-02-18 17:00:26
也许这就是你想要的
public enum Day {
Sunday("Sun"),
Monday("Mon"),
Tuesday("Tue"),
Wednesday("Wed"),
Thursday("Thu"),
Friday("Fri"),
Saturday("Sat");
private static final Map<String, Day> ELEMENTS;
static {
Map<String, Day> elements = new HashMap<String, Day>();
for (Day value : values()) {
elements.put(value.element(), value);
}
ELEMENTS = Collections.unmodifiableMap(elements);
}
private final String abbr;
Day(String abbr) {
this.abbr = abbr;
}
public String element() {
return this.abbr;
}
public static Day elementOf(String abbr) {
return ELEMENTS.get(abbr);
}
}https://stackoverflow.com/questions/443980
复制相似问题