【发布时间】:2010-10-01 10:25:06
【问题描述】:
为什么枚举的构造函数不能访问静态字段和方法?这对于类是完全有效的,但对于枚举是不允许的。
我想要做的是将我的枚举实例存储在静态地图中。考虑这个允许通过缩写查找的示例代码:
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
}
【问题讨论】:
-
正如stackoverflow.com/questions/443980/… 所描述的,我们有这个解决方法 Day(String...abbreviations) { For.ABBR.put(name(), this); for (String abbr : abbreviations) { For.ABBR.put(abbr, this); } } // 解决方法 stackoverflow.com/questions/443980/… private static class For { private static final Map
ABBR = new HashMap(); }