1. Introducción
En programación a menudo hay que trabajar con listas de opciones conocidas y limitadas. Por ejemplo: días de la semana, colores del semáforo, niveles de dificultad de un juego, estados de un pedido. Cada una de estas opciones suele estar representada por un valor fijo. Aquí nos acercamos al tema de hoy: las enumeraciones (enum).
Enumeración — es un tipo de datos especial que permite declarar un conjunto de constantes con nombre.
Un enum es como una caja con etiquetas en compartimentos, donde cada etiqueta es un nombre único asociado a un número.
Ventajas principales de enum:
- Tu código se vuelve más legible y autodocumentado;
- En lugar de misteriosos «números mágicos» como 0, 1, 2, aparecen nombres expresivos: DayOfWeek.MONDAY o TrafficLight.RED;
- El compilador se quejará si intentas asignar un valor incorrecto;
- ¡Detrás de cada elemento hay... un número entero normal! (Pero volveremos a ello más adelante.)
Sintaxis de declaración de enum
// Plantilla general para declarar una enumeración
public enum Name
{
CONSTANT1 ,
CONSTANT2 ,
CONSTANT3
}
Declarar una enumeración en Java es muy sencillo. Aquí tienes un ejemplo básico:
// Archivo DayOfWeek.java
public enum DayOfWeek {
MONDAY, // 0
TUESDAY, // 1
WEDNESDAY, // 2
THURSDAY, // 3
FRIDAY, // 4
SATURDAY, // 5
SUNDAY // 6
}
Explicación:
- La palabra clave enum le dice al compilador: «¡Esto es una enumeración!»
- Entre llaves, separados por comas, van los nombres de las opciones (constantes).
- Es habitual escribir los nombres en UPPER_SNAKE_CASE (todas las letras en mayúsculas, palabras separadas por guion bajo).
¿Dónde se puede declarar un enum?
- En un archivo independiente (DayOfWeek.java).
- Dentro de una clase (si necesitas una enumeración privada solo para esa clase).
- Incluso dentro de un método (aunque es poco habitual).
2. Uso de enum en el código
Declaración de una variable de tipo enum:
DayOfWeek today = DayOfWeek.MONDAY;
Ahora today solo puede tomar uno de los valores declarados en DayOfWeek.
Ejemplo de uso en switch
switch (today)
{
case MONDAY:
System.out.println("Uf, lunes...");
break;
case FRIDAY:
System.out.println("¡Hurra, viernes!");
break;
default:
System.out.println("Un día normal.");
}
Diferencia importante: en case escribimos solo el nombre de la constante (sin prefijo) si el tipo de la variable ya es conocido por el compilador.
Recorrer todos los valores de un enum
Cada enum tiene un método estático values() que devuelve un array con todos sus valores:
for (DayOfWeek day : DayOfWeek.values())
{
System.out.println(day);
}
Es muy útil para mostrar menús, validar, generar opciones, etc.
3. Métodos de enum: name(), ordinal(), valueOf()
Las enumeraciones en Java no son solo listas de constantes, ¡son clases completas con métodos!
Método name()
Devuelve el nombre de la constante como cadena (tal como está en el código):
DayOfWeek day = DayOfWeek.FRIDAY;
System.out.println(day.name()); // "FRIDAY"
Método ordinal()
Devuelve el índice ordinal de la constante (a partir de cero):
System.out.println(DayOfWeek.MONDAY.ordinal()); // 0
System.out.println(DayOfWeek.FRIDAY.ordinal()); // 4
Atención: No conviene almacenar o comparar enums por ordinal() si el orden puede cambiar en el futuro. Es mejor usar los nombres.
Método valueOf(String name)
Convierte una cadena en un valor del enum si existe tal constante:
DayOfWeek day = DayOfWeek.valueOf("MONDAY");
System.out.println(day); // MONDAY
Si la cadena no coincide, se lanzará la excepción IllegalArgumentException.
Método values()
Devuelve el array de todos los valores del enum (ya vimos un ejemplo arriba):
DayOfWeek[] days = DayOfWeek.values();
4. Enum con campos, constructor y métodos
Las enumeraciones en Java se pueden ampliar: añadir campos, constructores y métodos. Sí, no es solo una lista de nombres, sino una mini‑clase.
Ejemplo: días de la semana con nombre localizado
public enum DayOfWeek
{
MONDAY("Lunes"),
TUESDAY("Martes"),
WEDNESDAY("Miércoles"),
THURSDAY("Jueves"),
FRIDAY("Viernes"),
SATURDAY("Sábado"),
SUNDAY("Domingo");
private final String russianName;
// Constructor (private por defecto)
DayOfWeek(String russianName)
{
this.russianName = russianName;
}
public String getRussianName()
{
return russianName;
}
}
Verás más detalles de cómo funciona cuando empecemos a estudiar POO en los niveles 27+ :P
Ahora puedes hacer algo así:
DayOfWeek day = DayOfWeek.WEDNESDAY;
System.out.println(day.getRussianName()); // "Miércoles"
Truco: Cada valor del enum puede tener sus propios datos (en este caso, un nombre localizado).
Ventajas de usar enum
- Seguridad de tipos: no puedes asignar por accidente a una variable enum un valor que no esté en la lista.
- Legibilidad: el código se autodocumenta (TrafficLight.RED en lugar de 1 o "red").
- Facilidad de mantenimiento: si necesitas añadir o eliminar una opción, se hace en un solo lugar.
- Funciona con switch: enum es ideal para ramificar según valores.
- Se puede ampliar: añadir campos, métodos, implementar interfaces.
- Menos errores: el compilador ayuda a no olvidar tratar los casos (especialmente en construcciones de switch).
6. Práctica: usamos enum en nuestra aplicación
Añadamos a nuestra miniaplicación el soporte de días de la semana mediante enum.
Paso 1. Declaremos el enum
public enum DayOfWeek
{
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Paso 2. Usarlo en el código
System.out.println("Introduce un día de la semana (por ejemplo, MONDAY):");
Scanner console = new Scanner(System.in);
String input = console.nextLine().toUpperCase();
DayOfWeek day = DayOfWeek.valueOf(input);
switch (day)
{
case MONDAY:
System.out.println("¡Empieza la semana laboral!");
break;
case FRIDAY:
System.out.println("¡Ya casi es fin de semana!");
break;
case SATURDAY:
case SUNDAY:
System.out.println("¡Hurra, fin de semana!");
break;
default:
System.out.println("Un día laborable normal.");
}
Qué ocurre:
- El usuario introduce un día de la semana (por ejemplo, "monday" o "MONDAY").
- Convertimos la cadena a mayúsculas (toUpperCase()) para no depender del caso.
- Convertimos la cadena a un valor del enum mediante valueOf.
- Usamos switch para imprimir distintos mensajes.
- Si se introduce algo incorrecto, capturamos el error y mostramos una advertencia.
7. Errores típicos al trabajar con enum
Error n.º 1: usar cadenas o números en lugar de enum. Muy a menudo, los principiantes siguen escribiendo así:
int day = 1; // 1 — ¿es lunes?
o
String status = "DELIVERED";
Esto es malo: puedes equivocarte al escribir y es difícil mantener el código. ¡Usa enum!
Error n.º 2: comparar enums con == y .equals(). En Java los valores de un enum se pueden comparar con == — es seguro, porque todos los valores son únicos dentro de la clase enum:
if (day == DayOfWeek.MONDAY) { ... } // OK!
Aunque .equals() también funciona, se suele usar ==.
Error n.º 3: malos nombres de elementos del enum. No llames a los elementos VALUE1, VALUE2, VALUE3: ¡en un mes nadie sabrá qué significan! Usa nombres significativos.
Error n.º 4: usar ordinal() para la lógica. No escribas así:
if (day.ordinal() == 0) { ... } // ¡No lo hagas!
El orden de los elementos puede cambiar y todo se romperá. ¡Usa los nombres!
GO TO FULL VERSION