En Java, ¿por qué es posible calificar una constante enumera con otra constante enumente?

StackOverflow https://stackoverflow.com/questions/4742178

  •  12-10-2019
  •  | 
  •  

Pregunta

Recientemente, he notado, es posible tener:

class Test {
    public enum Season { WINTER, SPRING, SUMMER, FALL }
    Season field = Season.WINTER.SPRING; // why is WINTER.SPRING possible?
}

¿Hay alguna razón para esto?

¿Fue útil?

Solución

Cuando accede a un miembro estático de un objeto (incluidos enums) 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, dado que los enums son efectivamente "estáticos", Season.WINTER.SPRING es equivalente a Season.SPRING; Season.WINTER se reemplaza por su tipo enum Season.

Como nota al margen, se desaconseja acceder a miembros estáticos desde instancias porque puede ser bastante confuso. Por ejemplo, si vio un código que contenía someThread.sleep(), podrías ser engañado para que creas que someThread se pone a dormir. Sin embargo, desde sleep() es estático, ese código realmente está invocando Thread.sleep() que duerme el hilo actual.

Otros consejos

Es porque enums son una especie de clases especiales. Si echamos un vistazo a los campos dentro de la temporada. 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

Entonces, cada valor de enumación es en realidad también un constante estática de la clase enum, temporada, y así tienen acceso a los campos estáticos de la temporada, o los otros valores de enumes (incluido sí mismo).

Sin embargo, probablemente sea mejor acceder a los valores de Enum directamente desde el enum, como la temporada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top