java-enums-enumerados-avanzados

Enums en Java: valores, atributos y métodos

  • 3 min

Un enum es un tipo que representa un conjunto cerrado de valores con nombre.

Imagina que estás programando una aplicación para una tienda de camisetas. Tienes que guardar la talla.

¿Qué tipo de dato usas?

  • ¿Un String? producto.talla = "Grande"; (Peligro: Alguien podría escribir “Grandee” o “Big”).
  • ¿Un int? producto.talla = 3; (Peligro: ¿Qué significa 3? ¿L, XL? ¿Y si alguien pone 99?).

Para solucionar esto, para representar un conjunto fijo y limitado de opciones, existen los Enumerados (Enums).

El enum básico

La sintaxis básica es muy sencilla. Definimos un nuevo tipo de dato con las opciones permitidas. Por convención, las constantes van en MAYÚSCULAS.

public enum Talla {
    PEQUENA, MEDIANA, GRANDE, EXTRAGRANDE
}
Copied!

Ahora tenemos seguridad de tipos (Type Safety). El compilador no nos dejará meter basura.

Talla miTalla = Talla.MEDIANA;

// Talla t = "MEDIANA"; // Error de compilación
// Talla t = 2;         // Error de compilación
Copied!

Usando enums en switch

Los Enums son los mejores amigos del switch. El código se lee casi como lenguaje natural.

switch (miTalla) {
    case PEQUENA -> System.out.println("Talla S");
    case MEDIANA -> System.out.println("Talla M");
    case GRANDE, EXTRAGRANDE -> System.out.println("Talla L/XL");
}
Copied!

Enums avanzados: atributos y constructores

Como hemos dicho, en Java un enum es realmente una Clase especial (que hereda de java.lang.Enum). Esto significa que pueden tener atributos, constructores y métodos.

Sigamos con las tallas. Una talla no es solo un nombre (“GRANDE”), también suele tener una abreviatura (“L”) y un ancho en centímetros (52). Podemos guardar esa información dentro del propio Enum.

public enum Talla {
    // 1. Definimos las constantes, pasando datos al constructor
    PEQUENA("S", 48),
    MEDIANA("M", 50),
    GRANDE("L", 52),
    EXTRAGRANDE("XL", 54); // El punto y coma separa las constantes del resto del código

    // 2. Atributos (finales, porque los enums son constantes)
    private final String abreviatura;
    private final int anchoCm;

    // 3. Constructor (Privado obligatoriamente)
    // Solo se llama internamente al crear las constantes de arriba
    private Talla(String abreviatura, int ancho) {
        this.abreviatura = abreviatura;
        this.anchoCm = ancho;
    }

    // 4. Getters (para acceder a los datos)
    public String getAbreviatura() { return abreviatura; }
    public int getAnchoCm() { return anchoCm; }
}
Copied!

Fíjate en la potencia de esto. Ahora el dato y su metadato van juntos.

Talla t = Talla.GRANDE;
System.out.println(t.getAbreviatura()); // Imprime "L"
System.out.println(t.getAnchoCm());     // Imprime 52
Copied!

Métodos en enums

Podemos añadir lógica de negocio directamente en el Enum.

public enum Operacion {
    SUMA, RESTA, MULTIPLICACION, DIVISION;

    public double calcular(double a, double b) {
        return switch (this) { // 'this' es la constante actual (SUMA, RESTA...)
            case SUMA -> a + b;
            case RESTA -> a - b;
            case MULTIPLICACION -> a * b;
            case DIVISION -> a / b;
        };
    }
}

// Uso:
double res = Operacion.SUMA.calcular(10, 20); // 30.0
Copied!

Métodos útiles: values() y valueOf()

Java regala un par de métodos estáticos a todos los Enums que son muy útiles para recorrerlos.

  • values(): Devuelve un Array con todas las constantes. Ideal para llenar un ComboBox en una interfaz gráfica.
for (Talla t : Talla.values()) {
    System.out.println(t); // Imprime PEQUENA, MEDIANA...
}
Copied!
  • valueOf("STRING"): Convierte texto a Enum. Muy útil cuando lees datos de un fichero o base de datos.
String texto = "GRANDE";
Talla t = Talla.valueOf(texto); // Convierte a Talla.GRANDE
Copied!

Si el texto no coincide exactamente, lanza IllegalArgumentException.