2011-01-20 28 views

risposta

10

Quando si accede a un membro statico di un oggetto (incluse le enumerazioni) in Java, il compilatore sostituisce efficacemente l'oggetto con il suo tipo statico. Più concretamente,

class ExampleClass { 
    static int staticField; 
    static void staticMethod() { 
     ExampleClass example = new ExampleClass(); 
     example.staticField;  // Equivalent to ExampleClass.staticField; 
     example.staticMethod(); // Equivalent to ExampleClass.staticMethod(); 
    } 
} 

Analogamente, poiché enumerazioni sono effettivamente "statica", Season.WINTER.SPRING è equivalente a Season.SPRING; Season.WINTER viene sostituito con il tipo enum Season.

Come nota a margine, l'accesso ai membri statici dalle istanze è scoraggiato perché può essere piuttosto confuso. Ad esempio, se hai visto un pezzo di codice che conteneva someThread.sleep(), potresti essere indotto a credere che someThread sia stato messo a riposo. Tuttavia, dal momento che sleep() è statico, il codice sta effettivamente invocando Thread.sleep() che dorme il thread corrente.

+0

Buono , chiaro, rispondi. Grazie. –

+0

Consiglio di attivare gli avvisi per l'accesso statico (Eclipse ha questa opzione, probabilmente anche altri IDE). Correggo sempre quegli avvertimenti per quella specifica ragione: sono confusi e possono indurre in errore chiunque stia leggendo il codice a pensare che il programma stia facendo qualcosa che non è. –

1

È perché le enumerazioni sono una specie di classi speciali. Se diamo uno sguardo ai campi all'interno di Season.WINTER, ad esempio:

for (Field field : Test.Season.WINTER.getClass().getFields()) 
    System.out.println(field); 

Vedremo come output:

public static final TestEnum$Test$Season TestEnum$Test$Season.WINTER 
public static final TestEnum$Test$Season TestEnum$Test$Season.SPRING 
public static final TestEnum$Test$Season TestEnum$Test$Season.SUMMER 
public static final TestEnum$Test$Season TestEnum$Test$Season.FALL 

Così ogni valore enum è in realtà anche una statica costante della classe enum, Season e così hanno accesso ai campi statici di Season o agli altri valori enum (incluso se stesso).

Tuttavia, probabilmente è meglio accedere ai valori dell'enumerazione direttamente dall'enumerazione, come Season.SPRING, poiché è più semplice e meno probabile confondere qualcuno leggendo il codice.

Problemi correlati