2 Operaciones con tipos enumerados¶
Constructores¶
Los enum se implementan internamente como clases. El enum DayOfWeek internamente se convierte en:
class DayOfWeek {
public static final DayOfWeek MONDAY = new DayOfWeek();
public static final DayOfWeek TUESDAY = new DayOfWeek();
public static final DayOfWeek WEDNESDAY = new DayOfWeek();
// ...
}
Los enum de Java son clases que exportan una instancia (objeto) para cada constante de enumeración a través de un campo final estático público. Estas instancias son creadas automáticamente al hacer referencia al enum en nuestro código, es decir, el constructor se ejecuta para cada constante en el momento de la carga de la clase enum. No podemos crear objetos enum explícitamente y, por lo tanto, no podemos invocar al constructor directamente:
Los únicos modificadores de acceso permitidos para los constructores de los enum son friendly y private. Los modificadores de acceso protected y public dan un error de compilación.
Como vemos, los enum de Java son una generación del patrón de diseño singleton permitiendo una determinada serie de instancias, cada una de las cuales es accesible a través de una constante. Visto de forma inversa, podríamos decir que un singleton no es más que un enum con una sola instancia.
Comparaciones¶
Los enum se pueden comparar utilizando el operador relacional ==:
if(day == DayOfWeek.MONDAY){
// ...
}
DayOfWeek day = DayOfWeek.MONDAY;
System.out.println(day == DayOfWeek.MONDAY ? "Es lunes" : "No es lunes")
El compilador nos da un error si intentamos comparar valores de diferentes tipos enum:
Enums en switch¶
También podemos utilizar switch para comprobar en los case los distintos valores del enum:
switch(day){
case MONDAY:
System.out.println("Lunes");
break;
case MONDAY:
System.out.println("Martes");
break;
// ...
}
¡OJO!
No es necesario calificar las constantes en las declaraciones de case con su nombre de tipo enum. De hecho, intentar hacerlo provocará un error de compilación