24 de enero de 2019

Sentencia switch

La sentencia switch nos va a servir para el control del flujo de nuestra aplicación.

Al contrario que if que ejecuta un bloque si se cumple una expresión (boolean) y si añadimos else se ejecuta otro bloque si no se cumple, con switch podemos tener varios caminos a seguir evaluando una expresión de otros tipos y delegar la ejecución sobre el caso que encaje, entre una variedad de ellos (no sólo true o false).

He puesto esta entrada en esta parte menos usada porque, según mi experiencia, realmente se usa poco. Esto tiene fácil explicación:
  1. Su sintaxis se suele olvidar por usarse poco, ser bastante larga y dar bastante pereza.
  2. Normalmente con unos pocos casos usando if/if-else conseguimos lo mismo con mayor rendimiento.
  3. Usar un Map para recuperar valores (resultados de un switch) por una clave (casos case) mejora el mantenimiento.
  4. Tiene limitaciones en los tipos que se pueden usar para los casos (básicamente int, String, y Enum) .
  5. Seguramente, conscientes de esto en Java 12 mejoran su sintaxis.
Pero para que no quede sin ver una sentencia que se puede encontrar en la mayoria de lenguajes de programación vamos a ver su sintaxis y un ejemplo.

La sentencia switch se define usando la palabra reservada switch, estableciendo un valor a evaluar (expresion) y varios apartados conteniendo cómo proceder en función del valor evaluado (case) que puede declarar al final qué hacer en caso de no encontrar coincidencias (caso default):

Nos hacemos el siguiente método:
static void testSwitch(int expresion) {
  switch (expresion) {
  case 1:
    System.out.println("Caso 1");
    break;
  case 2: case 3:
    System.out.println("Caso 2 o 3");
    //break; Si omitimos "break" sigue ejecutando
  case 4:
  case 5:
    System.out.println("Caso 4 o 5");
    break;
  default:
    System.out.println("Ninguno caso encaja");
    break;
  }
}
Podemos ver que hay una expresion de tipo int y cuatro casos (case) que se pueden ejecutar en función de su valor:
  1. case 1: Cuando expresion tenga valor 1
  2. case 2: case 3: Cuando expresion tenga valor 2 o 3
  3. case 4:
    case 5:
    Cuando expresion tenga valor 4 o 5
  4. default: Cuando no sea ninguno de los anteriores
Fijaros que para el case 2: case 3: NO hemos puesto break antes del siguiente case. No debemos olvidarnos de ponerlo si no queremos que se siga ejecutando todo el código del switch hasta que se encuentre un break o termine el bloque switch.

Al probar este método con el siguiente código:
testSwitch(0);
testSwitch(1);
testSwitch(3);
Tenemos la siguiente salida:

Ninguno caso encaja
Caso 1
Caso 2 o 3
Caso 4 o 5

Esto es el resultado de:
  • Ninguno caso encaja: 0 (cero) no está entre las opciones elegidas y se ejecuta default.
  • Caso 1: coincide y ejecuta case 1 hasta el break.
  • Caso 2 o 3 + Caso 4 o 5: coincide con case 3 pero al no haber puesto break se sigue ejecutando lo siguiente hasta que encuentra otro break.
Espero que haya quedado claro, si no, usa los comentarios.

2 comentarios:

  1. Habiendo realizado el metodo switch, no me sale el resultado como se espera:

    public class Switch {

    public static void main(String[] args) {

    testSwitch(0);
    testSwitch(1);
    testSwitch(3);
    testSwitch(4);
    testSwitch(2);
    }

    public static void testSwitch (int expresion) {
    switch (expresion) {
    case 1:
    System.out.println("Caso 1");
    break;
    case 2|3:
    System.out.println("Caso 2 o 3");
    //break;
    case 4:
    System.out.println("Caso 4");
    break;
    default:
    System.out.println("Ningun caso encaja");
    break;
    }

    }
    ¿Por qué cuando hago el testSwitch (2) me da como resultado default?

    Pongo el resultado de la consola:

    Ningun caso encaja
    Caso 1
    Caso 2 o 3
    Caso 4
    Caso 4
    Ningun caso encaja

    ResponderEliminar
    Respuestas
    1. El problema es el código que puse en el método testSwitch. Creo que en otro lenguaje sí se podía usar un pipe ('|') para agrupar cases.

      He modificado el ejemplo para corregirlo y añadir el caso 5 para que se vea que en la sintaxis sirve concatenar varios case en la misma línea o en líneas distintas.

      Gracias por advertir del fallo.

      Eliminar

Compárteme

Entradas populares