2009-09-04 3 views
10

Per usare un esempio forzato in Java, ecco il codice:In Java, quando viene richiamato il costruttore per una costante enumerata?

enum Commands{ 
    Save("S"); 
    File("F"); 

    private String shortCut; 
    private Commands(String shortCut){ this.shortCut = shortCut; } 
    public String getShortCut(){ return shortCut; } 
} 

Ho il seguente test/codice del driver:

public static void main(String args[]){ 
    System.out.println(Commands.Save.getShortCut()); 
} 

La domanda è: In Java, quando è il costruttore per una costante enumerata invocata? Nell'esempio sopra, sto solo usando la costante enumerata Save. Significa che il costruttore è chiamato una volta solo per creare Save? O sia Save sia File essere costruiti insieme indipendentemente?

risposta

11

I costruttori vengono richiamati quando la classe enum viene inizializzata. Ogni costruttore sarà invocato, in ordine di dichiarazione membro, indipendentemente da quali membri sono effettivamente referenziati e utilizzati.

+0

Significa che quando 'ClassLoader' carica la classe, viene richiamato Constructor of enum? o l'accesso al membro come Salva e File invocherà il costruttore? Cosa succede se non esiste un costruttore di argomenti? –

+0

@MuhammadBabar Una classe può essere caricata senza essere inizializzata. Quindi, no, significa che quando la classe è inizializzata, ogni membro è costruito. E, come ho detto, non importa se un membro è referenziato; viene costruito quando la classe è inizializzata. La tua seconda domanda non è chiara. Se non vengono forniti argomenti per il membro, deve essere definito un costruttore no-arg o l'enum non verrà compilato. È questo che vuoi dire? – erickson

+0

Ma in enum non facciamo mai new SomeEnum() i.e nessuna inizializzazione esplicita! Nel mio caso enum ha solo una variabile i.e * instance * e un costruttore privato senza argomenti. Quando viene chiamato questo costruttore? –

3

Proprio come il metodo static() {...}, i costruttori vengono richiamati quando la classe Enum viene inizializzata per la prima volta. Tutte le istanze dell'Enum vengono create prima di poter essere utilizzate.

public static void main(String args[]){ 
    System.out.println(Commands.Save.getShortCut()); 
} 

In questo esempio, il ctor sia per Save e File avranno completato prima Save.getShortCut() viene richiamato.

Vengono richiamati in sequenza, come dichiarato nel codice.

2

Entrambi verranno creati al momento di inizializzazione della classe come altri hanno detto. Mi piace sottolineare che questo viene fatto prima di qualsiasi inizializzatore statico in modo da poter utilizzare queste enumerazioni nel blocco statico.