这是来自有效的 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);
}
请注意,Operation 常量从创建常量后运行的静态块放入 stringToEnum 映射。试图让每个常量从其自己的构造函数中将自己放入映射中会导致编译错误。这是一件好事,因为如果它是合法的,它会导致 NullPointerException。不允许枚举构造函数访问枚举的静态字段,编译时常量字段除外。这个限制是必要的,因为这些静态字段在构造函数运行时还没有被初始化。
我的问题是关于这条线:
“请注意,操作常量是从创建常量后运行的静态块中放入 stringToEnum 映射的”。
我认为静态块在构造函数运行之前被执行。它们实际上是在类加载期间执行的。
我在这里想念什么?