ProgramaciónDesarrollador Backend

¿Qué es la expresión switch en Java, cómo se diferencia del switch clásico y qué matices hay en su uso?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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:

  • Switch se convirtió en una expresión: se puede asignar su resultado a una variable.
  • La nueva sintaxis facilita la lectura y previene los break olvidados.
  • Soporte para etiquetas múltiples (case A, B -> ...).

Preguntas capciosas.

¿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; };

Errores típicos y anti-patrones

  • La ausencia de default al trabajar con tipos no nulos dará lugar a un error de compilación.
  • Intentar manejar nulos fuera del default provocará NullPointerException.
  • Usar switch con muchos niveles de anidamiento, en lugar de polimorfismo.

Ejemplo de la vida real

Caso negativo

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:

  • Rápido de escribir.

Desventajas:

  • Errores pueden llevar a bugs críticos.
  • El código es difícil de leer y mantener.

Caso positivo

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:

  • Análisis exhaustivo: menos errores.
  • Código compacto y legible.

Desventajas:

  • Requiere Java 14+ y conocimiento de la sintaxis moderna.