【发布时间】:2012-07-31 09:06:08
【问题描述】:
这是来自 Effective Java:
// Implementing a fromString method on an enum type
private static final Map<String, Operation> stringToEnum
= new HashMap<String, Operation>();
static { // Initialize map from constant name to enum constant
for (Operation op : values())
stringToEnum.put(op.toString(), op);
}
// Returns Operation for string, or null if string is invalid
public static Operation fromString(String symbol) {
return stringToEnum.get(symbol);
}
请注意,操作常量被放入 stringToEnum 映射 来自在创建常量后运行的静态块。 试图让每一个常数把自己从自己的地图中放入 构造函数会导致编译错误。这是好事, 因为如果它是合法的,它将导致 NullPointerException。枚举 不允许构造函数访问枚举的静态字段, 除了编译时常量字段。这个限制是必要的 因为这些静态字段还没有被初始化时 构造函数运行。
我的问题是关于这条线的:
"请注意,Operation 常量被放入 stringToEnum 映射中 来自在创建常量后运行的静态块”。
我认为静态块在构造函数运行之前被执行。它们实际上是在类加载期间执行的。
我在这里错过了什么?
【问题讨论】: