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:
- Su sintaxis se suele olvidar por usarse poco, ser bastante larga y dar bastante pereza.
- Normalmente con unos pocos casos usando if/if-else conseguimos lo mismo con mayor rendimiento.
- Usar un Map para recuperar valores (resultados de un switch) por una clave (casos case) mejora el mantenimiento.
- Tiene limitaciones en los tipos que se pueden usar para los casos (básicamente int, String, y Enum) .
- Seguramente, conscientes de esto en Java 12 mejoran su sintaxis.
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:case 1:
Cuando expresion tenga valor 1case 2: case 3:
Cuando expresion tenga valor 2 o 3case 4:
Cuando expresion tenga valor 4 o 5
case 5:default:
Cuando no sea ninguno de los anteriores
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
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 elbreak
. - Caso 2 o 3 + Caso 4 o 5: coincide con
case 3
pero al no haber puestobreak
se sigue ejecutando lo siguiente hasta que encuentra otrobreak
.
Habiendo realizado el metodo switch, no me sale el resultado como se espera:
ResponderEliminarpublic 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
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.
EliminarHe 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.