
El operador switch
ha sido una parte fundamental del lenguaje Java desde sus primeras versiones, pero durante mucho tiempo su funcionalidad fue limitada. A partir de Java 12, gracias al Project Amber, el switch
comenzó una transformación radical hacia una herramienta más expresiva, concisa y poderosa. En este artículo veremos cómo ha evolucionado switch
desde Java 8 hasta Java 24.
🔢 Java 8: El switch
tradicional
El switch
funcionaba solo con tipos primitivos, String
y enums. No podía devolver valores y no podía usar tipos complejos como Object
o patrones.
switch (dia) {
case "LUNES":
case "MARTES":
System.out.println("Inicio de semana");
break;
case "VIERNES":
System.out.println("Fin de semana");
break;
default:
System.out.println("Día regular");
}
🪤 Java 12 y 14: switch
como expresión
Introducido como preview en Java 12 y oficializado en Java 14 con la JEP 361, se permitió que switch
devolviera un valor:
String resultado = switch (dia) {
case "LUNES", "MARTES" -> "Inicio";
case "VIERNES" -> "Cierre";
default -> "Otro";
};
Además, se agregó la palabra clave yield
para devolver valores desde bloques más complejos:
String resultado = switch (dia) {
case "MIERCOLES" -> {
log("Mitad de semana");
yield "Mitad";
}
default -> "Otro";
};
🕵️♂️ Java 17 a 21: Pattern Matching para switch
A partir de Java 17 (preview) y consolidado en Java 21 con la JEP 441, el switch
se volvió inteligente. Ahora podía trabajar con patrones y hacer «destructuring».
static void procesarForma(Shape shape) {
switch (shape) {
case Circle c -> System.out.println("Radio: " + c.radius());
case Rectangle r -> System.out.println("Ancho: " + r.width());
default -> throw new IllegalArgumentException("Forma desconocida");
}
}
🌟 Java 21+: when
y destructuring
Se introdujo el uso de when
como filtro adicional al case
:
switch (obj) {
case String s when s.length() > 5 -> System.out.println("String largo");
case String s -> System.out.println("String corto");
default -> {}
}
Y el destructuring se mejoró en Java 22 y 23, permitiendo acceder directamente a campos de record
:
record Punto(int x, int y) {}
switch (p) {
case Punto(int x, int y) when x == y -> System.out.println("Diagonal");
case Punto(int x, int y) -> System.out.println("No diagonal");
}
🔄 Java 24: Mejoras y consolidación
Java 24 no introduce un cambio radical a switch
, pero sí consolida los avances del pattern matching y optimiza el rendimiento del switch
con tipos complejos. También se siguen mejorando los casos de exhaustividad en sealed types
. Además de que se tiene soporte para los tipos de datos primitivos en el declaración inline.
🔹 Conclusión
Gracias a Project Amber, switch
ha dejado de ser una construcción limitada para convertirse en una poderosa herramienta de programación funcional y orientada a objetos. Si vienes de Java 8 o anteriores, los cambios te parecerán revolucionarios. Aprovecha estas mejoras para escribir código más claro, conciso y mantenible.
📅 ¡Prepárate! Porque Java sigue evolucionando. Si te gustó este resumen, mantente atento a futuras entradas donde exploraremos Project Amber, Loom, Panama y Valhalla con ejemplos claros.