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

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

我正在尝试将枚举实例存储在静态Map中。考虑下面的示例代码,它允许通过abbreivation查找:

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 {}在所有静态初始化程序的末尾添加一个块,然后在其中进行所有静态初始化,EnumSet.allOf 以获取所有值。

以上是 Java 为什么枚举的构造函数不能访问静态字段? 的全部内容, 来源链接: utcz.com/qa/414729.html

回到顶部