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.");
}
}
}