これはEffectiveJavaからのものです:
// 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が発生するため、これは良いことです。列挙型コンストラクターは、コンパイル時定数フィールドを除いて、列挙型の静的フィールドにアクセスすることは許可されていません。これらの静的フィールドはコンストラクターの実行時にまだ初期化されていないため、この制限が必要です。
私の質問はラインに関するものです:
「操作定数は、定数が作成された後に実行される静的ブロックからstringToEnumマップに配置されることに注意してください」。
コンストラクターが実行される前に静的ブロックが実行されると思いました。これらは、実際にはクラスのロード時に実行されます。
ここで何が欠けていますか?