La Evolución del Switch en Java: De Java 8 a Java 24

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.

Comparte la publicación

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *