2015-05-06 45 views
7

Si prega di guardare questo link. Nel suo libro Effective Java, Joshua Bloch diceUn enum può avere costruttori per ciascuna delle sue costanti

Si noti che le costanti Operazione vengono inserite nella mappa stringToEnum da un blocco statico che viene eseguito dopo la creazione delle costanti.

Cercando di fare ogni put costante sé nella mappa da proprio costruttore potrebbe causare un errore di compilazione

. Questa è una buona cosa, perché causerebbe una NullPointerException se fosse legale.

costruttori Enum non sono autorizzati ad accedere ai campi statici della del enum, eccezione a tempo di compilazione campi costanti.

Questa restrizione è necessaria perché questi campi statici non sono ancora stati inizializzati quando i costruttori corrono.

Ho due domande

  1. enumerazioni possono avere costruttori separati per ogni costante?
  2. Perché i campi della costante di tempo di compilazione sono accessibili nei costruttori ma non nei campi statici?

Grazie

+0

si può aggiungere codice di esempio per coloro che non possono accedervi dal tuo link? – Pshemo

+0

@Pshemo, Sì Signore, questo collegamento contiene l'intero articolo 30 del libro di Joshua Bloch Effective Java https://ly2xxx.wordpress.com/page/5/?app-download=ios – Ankit

+0

intendevo metterlo direttamente in questione. I link tendono a rompersi così quando accade la tua domanda sarà inutile per i futuri lettori. – Pshemo

risposta

4

Per quanto riguarda la prima domanda: non si può avere costruttori separate, ma si può lavorare-intorno a questo nel modo seguente:

public enum EnumTest { 
    ONE() { 
     void init() { 
      val = 2; 
     } 
    }, 
    TWO() { 
     void init() { 
      val = 1; 
     } 
    }; 

    protected int val; 

    abstract void init(); 

    EnumTest() { 
     init(); 
    } 
} 

In questo modo si dispone di vista tecnico i metodi di inizializzazione separate per diverse costanti .

Un altro modo è quello di utilizzare le sezioni di inizializzazione:

public enum EnumTest { 
    ONE() {{ 
      val = 2; 
     }}, 
    TWO() {{ 
      val = 1; 
     }}; 

    protected int val; 
} 

Per quanto riguarda la seconda domanda: campi costanti non sono accessibili durante la costruzione enum, perché le costanti enum sono accessibili per i campi statici. Ad esempio, questo codice compila correttamente:

public enum EnumTest { 
    ONE, TWO; 

    public static final String ONE_STRING = ONE.toString(); 
} 

Se si accede ONE_STRING dal costruttore sono stati autorizzati, si sia avuto un ciclo di inizializzazione senza fine o che accede di costante enum non ancora inizializzato.

+0

Grazie per la risposta Sir – Ankit

4
  1. No, e non credo che questo è ciò che significa Bloch, anche se non è stata formulata nel miglior modo possibile. Un enum può avere costruttori, come nel libro enum Operation. Cosa significa Bloch con "proprio costruttore" è: quando il costruttore di Operation viene eseguito per quella particolare costante.

  2. questo è già risposto da quello che hai citato sopra:

    Questa restrizione è necessaria in quanto questi campi statici non sono ancora stati inizializzati quando i costruttori corrono.

+0

Grazie per la risposta Sir – Ankit

+0

Quindi scusa, posso accettare solo una risposta. Ma sorveglierò le altre tue risposte per aumentare i tuoi numeri di +25 – Ankit

2

Si applicano le regole regolari per i costruttori. Puoi avere tutti i costruttori che vuoi purché abbiano firme diverse. Diverse enum valori possono essere costruiti utilizzando diversi costruttori:

enum StringAndNumber { 
    Zero("zero"), 
    Five(5), 
    Pi("Pi", 3.14159); 

    private final String str; 
    private final Number num; 

    private StringAndNumber(String str) { 
     this.str = str; 
     this.num = null; 
    } 

    private StringAndNumber(Number num) { 
     this.num = num; 
     this.str = null; 
    }  

    private StringAndNumber(String str, Number num) { 
     this.str = str; 
     this.num = num; 
    } 
} 
+0

Grazie per la tua risposta Misha – Ankit

+0

Quindi scusa, posso accettare solo una risposta. Ma sorveglierò le altre tue risposte per aumentare i tuoi numeri di +25 – Ankit