2011-01-20 28 views

Respuesta

10

Cuando accede a un miembro estático de un objeto (incluidas enumeraciones) en Java, el compilador reemplaza efectivamente el objeto con su tipo estático. Más 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(); 
    } 
} 

Del mismo modo, puesto que las enumeraciones son efectivamente "estático", Season.WINTER.SPRING es equivalente a Season.SPRING; Season.WINTER se reemplaza por su enumeración tipo Season.

Como nota al margen, no se recomienda el acceso a miembros estáticos de las instancias porque puede ser bastante confuso. Por ejemplo, si vio un fragmento de código que contenía someThread.sleep(), es posible que le engañen haciéndole creer que someThread ha quedado dormido. Sin embargo, dado que sleep() es estático, ese código está realmente invocando Thread.sleep() que duerme el hilo actual.

+0

Bueno , respuesta clara. Gracias. –

+0

Recomiendo activar las advertencias para el acceso estático (Eclipse tiene esta opción, otros IDEs probablemente también). Siempre corrijo esas advertencias por esa razón específica: son confusas y pueden inducir a error a cualquiera que esté leyendo el código a pensar que el programa está haciendo algo que no es. –

1

Es porque las enumeraciones son clases especiales. Si echamos un vistazo a los campos dentro de Season.WINTER, por ejemplo:

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

veremos como salida:

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 

Así que cada valor de enumeración es en realidad también un estática constante de la clase enum, Season, y así tienen acceso a los campos estáticos de Season, o a los otros valores enum (incluido él mismo).

Sin embargo, probablemente sea mejor acceder a los valores enum directamente desde la enumeración, como Season.SPRING, ya que es más simple y es menos probable que confunda a alguien que lea tu código.

Cuestiones relacionadas