Historia del tema:
Hasta Java 12, el operador switch se utilizaba exclusivamente como una declaración. Con la llegada de Java 12/14, aparecieron las expresiones switch (switch expression), que ampliaron la sintaxis y las capacidades del operador. Las expresiones switch están destinadas a un código más conciso y expresivo.
Problema:
El switch clásico a menudo provoca errores: un break olvidado conduce a un fall-through, problemas de legibilidad con múltiples casos, la imposibilidad de devolver un resultado directamente en la expresión, falta de una verificación exhaustiva de valores.
Solución:
La expresión switch puede devolver un valor, usar una sintaxis de flecha, soportar un análisis exhaustivo en tiempo de compilación y manejar nulos a través del default. Tiene la siguiente sintaxis:
String result = switch(day) { case MONDAY, FRIDAY -> "Día de trabajo"; case SATURDAY, SUNDAY -> "Fin de semana"; default -> throw new IllegalArgumentException(); };
Características clave:
¿Puede switch trabajar con enum, cadenas y nulos?
Con enum funciona desde Java 5. Con cadenas desde Java 7. Los nulos solo se manejan a través del default, de lo contrario se producirá NPE.
switch(day) { // day == null default: System.out.println("null"); } // funciona
¿Qué sucederá si no se implementan todas las variantes de enum en la expresión switch?
El compilador requerirá default o una implementación para todos los valores. Si falta esto, habrá un error de compilación.
¿Se puede usar break en la nueva expresión switch?
En la variante de flecha no se necesita break. Si se usa un bloque (case X -> { ... }), se puede aplicar yield para devolver un valor:
int num = switch(x) { case 1 -> 10; case 2 -> { yield 20; } default -> 0; };
Switch clásico con int sin break:
switch(type) { case 1: actionA(); case 2: actionB(); // se llama tanto para type==1 como para type==2 }
Ventajas:
Desventajas:
Uso de la nueva expresión switch para emparejar enum con el resultado:
String status = switch(orderStatus) { case PAID -> "Pagado"; case CANCELED -> "Cancelado"; default -> "En proceso"; };
Ventajas:
Desventajas: