Implementación de Enumeraciones en Java con Ejemplos Prácticos

1. Defiinción de días no laborales mediante enums

Se puede modelar si un día es festivo o de descanso sobrescribiendo métodos en una enumeración. A continuación, se muestra un enum para días de la semana con lógica personalizada para fines de semena.

public enum DiaSemana {
    LUNES(1), MARTES(2), MIERCOLES(3), JUEVES(4), VIERNES(5), SABADO(6) {
        @Override
        public boolean esFeriado() {
            return true;
        }
    },
    DOMINGO(0) {
        @Override
        public boolean esFeriado() {
            return true;
        }
    };

    private final int identificador;

    DiaSemana(int identificador) {
        this.identificador = identificador;
    }

    public int obtenerIdentificador() {
        return identificador;
    }

    public boolean esFeriado() {
        return false;
    }
}

2. Colecciones especializadas para enums: EnumSet y EnumMap

EnumSet permite manipular grupos de constantes enum de manera eficiente, mientras que EnumMap asocia claves enum con valores. En este ejemplo, se crea un conjunto de días laborales y un mapa que traduce abreviaturas a nombres completos.

import java.util.EnumSet;
import java.util.EnumMap;
import java.util.Map;

public class PruebaColecciones {
    public static void main(String[] args) {
        // Crear un conjunto con solo días laborables
        EnumSet<DiaSemana> diasLaborales = EnumSet.of(
            DiaSemana.LUNES, DiaSemana.MARTES, DiaSemana.MIERCOLES,
            DiaSemana.JUEVES, DiaSemana.VIERNES
        );
        System.out.println("Días laborales:");
        for (DiaSemana dia : diasLaborales) {
            System.out.println("- " + dia.name());
        }

        // EnumMap para mapear días a nombres en español
        EnumMap<DiaSemana, String> nombresDias = new EnumMap<>(DiaSemana.class);
        nombresDias.put(DiaSemana.LUNES, "Lunes");
        nombresDias.put(DiaSemana.MARTES, "Martes");
        nombresDias.put(DiaSemana.MIERCOLES, "Miércoles");
        nombresDias.put(DiaSemana.JUEVES, "Jueves");
        nombresDias.put(DiaSemana.VIERNES, "Viernes");

        System.out.println("\nMapeo de días:");
        for (Map.Entry<DiaSemana, String> entrada : nombresDias.entrySet()) {
            DiaSemana clave = entrada.getKey();
            String valor = entrada.getValue();
            System.out.println(clave.name() + " -> " + valor);
        }
    }
}

3. Obtención de instancias enum a partir de cadenas

Es común necesitar convertir una cadena de texto en el valor enum correspondiente. Esto se logra mediante un método estático que recorre las constantes definidas.

public enum DiaCalendario {
    LUN("Lunes", 1),
    MAR("Martes", 2),
    MIE("Miércoles", 3),
    JUE("Jueves", 4),
    VIE("Viernes", 5),
    SAB("Sábado", 6),
    DOM("Domingo", 7);

    private final String nombreCompleto;
    private final int indice;

    DiaCalendario(String nombreCompleto, int indice) {
        this.nombreCompleto = nombreCompleto;
        this.indice = indice;
    }

    public String getNombreCompleto() {
        return nombreCompleto;
    }

    public int getIndice() {
        return indice;
    }

    // Busca la constante enum por su nombre completo
    public static DiaCalendario buscarPorNombre(String nombre) {
        for (DiaCalendario dia : values()) {
            if (dia.getNombreCompleto().equalsIgnoreCase(nombre)) {
                return dia;
            }
        }
        throw new IllegalArgumentException("Día no encontrado: " + nombre);
    }
}

4. Estados de operación representados con enums

Las anumeraciones pueden codificar estados de respuesta, como éxitos o fallos en operaciones, facilitando el manejo de errores con códigos y mensajes predefinidos.

public enum EstadoOperacion {
    EXITO(1000, "Operación completada satisfactoriamente"),
    FALLO(1001, "La operación ha fallado"),
    ERROR_PARAMETROS(1002, "Parámetros inválidos");

    private final int codigo;
    private final String descripcion;

    EstadoOperacion(int codigo, String descripcion) {
        this.codigo = codigo;
        this.descripcion = descripcion;
    }

    public int getCodigo() {
        return codigo;
    }

    public String getDescripcion() {
        return descripcion;
    }

    // Recupera el estado basado en un código numérico
    public static EstadoOperacion desdeCodigo(int codigoBuscado) {
        for (EstadoOperacion estado : values()) {
            if (estado.getCodigo() == codigoBuscado) {
                return estado;
            }
        }
        return null;
    }
}

// Ejemplo de uso en una aplicación
public class EjemploUso {
    public static void main(String[] args) {
        int codigoRespuesta = 1002;
        EstadoOperacion estadoActual = EstadoOperacion.desdeCodigo(codigoRespuesta);

        if (estadoActual != null) {
            switch (estadoActual) {
                case EXITO:
                    System.out.println("Resultado: " + estadoActual.getDescripcion());
                    break;
                case FALLO:
                    System.out.println("Advertencia: " + estadoActual.getDescripcion());
                    break;
                case ERROR_PARAMETROS:
                    System.out.println("Error: " + estadoActual.getDescripcion());
                    break;
            }
        } else {
            System.out.println("Código de estado no reconocido.");
        }
    }
}

Etiquetas: java Enums EnumSet EnumMap SwitchStatement

Publicado el 6-18 19:30