Questo è da Effective Java:ordine di esecuzione dei blocchi statici in un tipo di WRT Enum al costruttore
// 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);
}
Si noti che le costanti di funzionamento sono messi in mappa stringToEnum da un blocco statico che viene eseguito dopo le costanti sono state create. Provare a rendere ogni costante inserita nella mappa dal proprio costruttore causerebbe un errore di compilazione. Questa è una buona cosa, perché causerebbe una NullPointerException se fosse legale. I costruttori Enum non sono autorizzati ad accedere ai campi statici dell'enum, eccetto per i campi delle costanti in fase di compilazione. Questa restrizione è necessaria perché questi campi statici non sono stati ancora inizializzati quando i costruttori sono in esecuzione.
La mia domanda è per quanto riguarda la linea:
"Si noti che le costanti di funzionamento sono messi in mappa stringToEnum da un blocco statico che viene eseguito dopo le costanti sono stati creati".
Ho pensato che il blocco statico venga eseguito prima dell'esecuzione del costruttore. Vengono effettivamente eseguiti durante il tempo di caricamento della classe.
Cosa mi manca qui?
Vedi http://stackoverflow.com/questions/3028219/are-there-any-guarantees-in-jls-about-order-of-execution-static -inizializzazione-b –