Un switch en Java es una manera de tomar una decisión a partir de un valor dado, con varios resultados posibles. Es sencillo de utilizar, aunque, como siempre, el examen puede tratar de confundirte (no me canso de decirlo 🙂 ).
More...
Estructura de un switch en Java (visualización)
Para entender cómo funciona un switch en Java, te voy a pedir que hagas un pequeño esfuerzo de imaginación.
Imagina que te encuentras en una gran habitación enmoquetada. En la pared, a tu izquierda, hay un cartel que reza:
Opciones
Frente a ti hay cinco puertas, y sobre ellas aparece la siguiente pregunta:
Cruza la puerta que corresponda: ¿cuántas monedas tienes en el bolsillo?
En cada puerta hay un letrero colgado:
5 monedas
10 monedas
15 monedas
20 monedas
Otra cantidad
En este ejemplo, los tres puntos que aparecen en el cartel se corresponden con los tres tipos de valores que se pueden utilizar en un switch en Java: un número entero (byte, short, char o int, junto con sus respectivas clases, de las que hablaré en el próximo artículo), una enumeración o enum (que no entra en el examen de OCA, de manera que no es necesario que, por ahora, sepas qué es) o una cadena de texto (String).
A continuación la pregunta que aparece en la pared es el valor que va a evaluar el switch. Y, en cada puerta, el "camino" que va a tomar la ejecución, dependiendo del valor seleccionado.
Pasamos a ver el código
¡Hay un problema! Como ves, si ejecutas el código del ejemplo se imprimen las cinco frases.
Lo que falla es la manera en la que sales de cada habitación. Tienes dos opciones: salir por una puerta que te lleve a otro lugar, fuera del switch, o cruzar una puerta lateral, que te lleva a la habitación de al lado. Como ves, de manera predeterminada la salida de cada habitación es, precisamente, esa puerta lateral, hasta la última opción, que abandona el switch.
Un switch con dos cases: 27 y 1725
La puerta de salida de un switch en Java: break
Así pues, vas a cruzar la primera puerta, ya que tienes 5 monedas en el bolsillo. Cruzas la puerta y entras en un despacho pequeño, sin muebles. En el otro extremo, hay una puerta con una única palabra escrita sobre la hoja:
break;
La cruzas, y apareces en un prado. Las habitaciones han quedado atrás.
Como ves, la palabra clave break te permite abandonar el switch una vez se haya ejecutado el código del case. Vamos a complicarlo un poco más.
Las letras del alfabeto en un diccionario son un ejemplo de switch en Java: cuando buscas una palabra, abres el diccionario por la letra inicial.
Cinco puertas, pero tres habitaciones: cases alineados
Imagínate que cruzas la primera puerta (porque, como ya hemos dicho, tienes 5 monedas) y te encuentras que las dos siguientes puertas también dan a esa misma habitación, que es bastante grande.
¿Ves cómo de feos están los cases, alineados? Queda feo, pero es válido, tenlo en cuenta.
default, o ¿y si tengo 13 monedas?
En ese caso, pueden ocurrir dos cosas: que el switch tenga una opción default, o que no la tenga.
Si no la tiene, la ejecución continúa fuera del switch, ya que no existe ninguna opción en el switch que se corresponda con el valor que tenemos, que es, en este caso, 13.
La opción default, o "predeterminada" en español, se ejecuta siempre y cuando el resto de cases del switch no se corresponda con el valor que tenemos. Es por eso que la última puerta tenía el letrero de Otra cantidad: si ninguna de las puertas anteriores es la tuya, pasa por aquí.
A tener en cuenta
Valores que puede tomar un case
Como ya te he dicho más arriba, un switch puede funcionar con números enteros, enums y Strings. A continuación te voy a explicar qué valores puede (o no puede) tener un case. Eso sí, dos cosas te digo desde ya:
Números enteros
Si el valor que estás utilizando es un número entero, puedes utilizar en el case cualquier valor que se le pueda asignar al primitivo (o a su clase asociada) de ese tipo. Es decir, si utilizas un byte, no puedes utilizar un case con un valor que supere su rango (de -128 a 127. Échale un ojo a este artículo para refrescar la memoria).
Además, puedes utilizar operaciones matemáticas:
¿Recuerdas la diferencia que había entre asignarle a un char el valor 9 y asignarle el valor '9'? Tenlo en cuenta si te encuentras con un switch en el examen.
String
Al igual que con los números enteros, puedes utilizar en el case cualquier texto que puedas asignarle a una referencia de tipo String.
La única diferencia en este caso es que String es un objeto, no una variable primitiva, y, por ello, puede tomar el valor null (que significa, en realidad, que no apunta a ningún objeto). No obstante, tú no puedes utilizar el valor null en un case. Si lo haces, el código no va a compilar:
Ejercicios propuestos
A continuación muestro varios ejemplos de switch "raros" que puedes encontrar en el examen. ¿Puedes deducir cuál va a ser el resultado antes de ejecutarlo? Si el resultado es distinto a lo que esperabas, ¿puedes deducir por qué?
1er jercicio : el espejismo
2º ejercicio: ¿código inaccesible?
A Java no le gusta nada cuando alguna línea de tu código es inaccesible. Si lo intentas, te lanza a la cara un error de compilación. ¿Qué crees entonces que ocurre en este caso?
3er ejercicio: switch sin cuerpo
¿Qué crees que va a pasar con estos switch incorpóreos?
4º ejercicio: las puertas tienen una mirilla
La variable cuatro se declara en un case en el que el hilo de ejecución no accede. ¿Qué ocurre?
¿Qué te han parecido los ejercicios? Si tienes alguna duda, puedes preguntar en los comentarios. ¡Te espero!