Yassine Badache:
Considere el siguiente código:
public enum MyOwnEnum {
JANVIER("janvier", "3101"),
FEVRIER("février", new DateCalculator().getLeapYear()),
MARS("mars", "3103"),
AVRIL("avril", "3004");
// Two variables, the protected constructor, getters
}
¿Cómo se comportaría el código? Sería el método de calcular directamente en tiempo de compilación y se fija, o sería calcula cada vez que llama a alguien FEVRIER
a través de MyOwnEnum.FEVRIER
o MyOwnEnum.valueOf("FEVRIER")
? O fijo, pero en tiempo de ejecución?
Robby Cornelissen:
Las constantes de enumeración se crean una vez en tiempo de ejecución, o más específicamente, al tiempo de la clase de carga.
Considere el siguiente código:
public enum TestEnum {
ONE("One at " + System.nanoTime()),
TWO("Two at " + System.nanoTime());
String value;
TestEnum(String value) {
System.out.println(value);
this.value = value;
}
}
public class Test {
public static void main(String[] args) throws Exception {
System.out.println("Loading");
Class.forName("TestEnum"); // Load class
System.out.println("Evaluating");
System.out.println(TestEnum.ONE.value); // Evaluate value one
System.out.println(TestEnum.TWO.value); // Evaluate value two
}
}
Esto genera el siguiente resultado:
Loading
One at 31207575500045
Two at 31207575625697
Evaluating
One at 31207575500045
Two at 31207575625697
Tenga en cuenta que los valores no cambian en las invocaciones posteriores.