Konstruktor wird von Effective Java:Ausführungsreihenfolge von der statischen Blöcke in einer Enum-Typ WRT Dieser
// 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);
}
Beachten Sie, dass die Betriebskonstanten in die Karte stringToEnum setzen von einem statischen Block, der nach läuft Die Konstanten wurden erstellt. Der Versuch, die Konstanten so zu setzen, dass sie sich in einem eigenen Konstruktor befinden, würde einen Kompilierungsfehler verursachen. Das ist eine gute Sache, weil es eine NullPointerException verursachen würde, wenn es legal wäre. Enum Konstruktoren dürfen nicht auf die statischen Felder der Enumeration zugreifen, , mit Ausnahme von Konstantenfeldern zur Kompilierungszeit. Diese Einschränkung ist notwendig , da diese statischen Felder noch nicht initialisiert wurden, wenn die -Konstruktoren ausgeführt werden.
Meine Frage ist in Bezug auf die Zeile:
„Beachten Sie, dass die Betriebskonstanten in die Karte stringToEnum gesetzt werden von einem statischen Block, der ausgeführt wird, nachdem die Konstanten erstellt worden sind“.
Ich dachte, der statische Block wird ausgeführt, bevor der Konstruktor ausgeführt wird. Die werden tatsächlich während der Ladezeit der Klasse ausgeführt.
Was fehlt mir hier?
Siehe http://stackoverflow.com/questions/3028219/are-there-any-guarantees-in-jls-about-order-of-execution-static -initialisierung-b –