Kolejność wykonywania bloków statycznych w typie Enum w.r.t do konstruktora
To z 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);
}
Zauważ, że stałe operacji są umieszczane na mapie stringToEnum z bloku statycznego, który działa po utworzeniu stałych. Próba umieszczenia każdej stałej w mapie z własnego konstruktora spowodowałaby błąd kompilacji. To dobra rzecz, ponieważ spowodowałoby wyjątek NullPointerException, gdyby był legalny. Enum konstruktory nie mają dostępu do pól statycznych enum, z wyjątkiem pól stałych czasu kompilacji. To ograniczenie jest konieczne, ponieważ te pola statyczne nie zostały jeszcze zainicjowane podczas uruchamiania konstruktorów.
Moje pytanie dotyczy linii:
„Zauważ, że stałe operacji są umieszczane na mapie stringToEnum z bloku statycznego, który działa po utworzeniu stałych”.
Myślałem, że blok statyczny zostanie wykonany przed uruchomieniem konstruktora. Są one faktycznie wykonywane podczas czasu ładowania klasy.
Czego mi tu brakuje?