Volevo creare un enum
in cui a ogni costante è associato uno Map
. Ho compiuto questo dando ogni costante inizializzatore un'istanza, così:Perché questo enum viene compilato?
import java.util.HashMap;
import java.util.Map;
public enum Derp {
FOO {{
mMap.put("bar", 1);
}};
// cannot be private
protected final Map<String, Integer> mMap = new HashMap<>();
}
ho scoperto che se mMap
è private
, non può essere fatto riferimento nel caso di inizializzazione. L'errore è Cannot make a static reference to the non-static field mMap
. Prima che la ragione di questo si è verificato a me, ho consultato JLS §8.9.2, che dice in parte:
Si tratta di un errore di compilazione per i costruttori, blocchi esempio di inizializzazione, o un'istanza espressioni di inizializzazione delle variabili di un enum costanti
e
a fare riferimento ae
oa una costante enum dello stesso tipo dichiarata a destra die
.
non sono io infrangendo questa regola implicitamente riferimento FOO
nella propria istanza intializer FOO
s'? Come si compila? Non solo compila, ma funziona correttamente in fase di runtime.
(Mi venne in mente che non può essere mMap
private
perché sto implicitamente la creazione di una sottoclasse anonima che non può fare riferimento a un campo private
nella sua superclasse. Che è un po 'strano di per sé dal momento che le enumerazioni sono implicitamente final
...)
"enumerazioni sono implicitamente' final'" - [non del tutto] (http://ideone.com/3bi0U1). Java ha bisogno di creare sottoclassi implicite per ogni istanza ogni volta che si fa il problema con le parentesi accanto a una costante enum, quindi se lo fai, la classe enum non è definitiva. Tuttavia, non puoi ancora dichiarare le tue sottoclassi. – user2357112
Qualifica la chiamata come 'super.mMap.put (...);'. La ragione di questo è solo una specifica strana. – Radiodef
@Radiodef Non sono convinto che si tratti di un duplicato. Penso che questo poster faccia due domande che non sono state poste nel post collegato: (1) perché è legale se usa 'protected' e (2) perché non è l'autoreferenziale implicito illegale. Ho esaminato le risposte lì e non rispondono alla domanda con mia soddisfazione. – ajb