1. Introducción
Imagina que estás escribiendo un programa para una cafetería. El usuario puede elegir una bebida y necesitas reaccionar a esa elección. Por supuesto, podrías usar un montón de if-else if-else, pero no queda muy bien:
if (choice == 1)
{
System.out.println("Has elegido un espresso.");
}
else if (choice == 2)
{
System.out.println("Has elegido un capuchino.");
}
else if (choice == 3)
{
System.out.println("Has elegido un latte.");
}
else
{
System.out.println("No existe esa bebida.");
}
Estarás de acuerdo, se ve aparatoso. ¿Y si hubiera 10 o 20 opciones? Aquí es donde entra en juego el operador switch, que permite implementar de forma elegante y compacta la selección entre múltiples opciones según el valor de una variable.
Sintaxis del switch clásico
La sintaxis de switch en Java es la siguiente:
switch (vyrazhenie)
{
case znachenie1:
// acciones, si vyrazhenie == znachenie1
break;
case znachenie2:
// acciones, si vyrazhenie == znachenie2
break;
...
default:
// acciones, si no coincide con ningún case
break;
}
switch en Java
Elementos clave:
- switch (expresión) — la expresión cuyo resultado se compara con cada case.
- case valor: — la alternativa con la que se compara la expresión.
- break; — termina la ejecución del bloque switch (de lo contrario — «fall-through» al siguiente case).
- default: — se ejecuta si no coincide con ningún case.
2. Ejemplos de uso de switch
Ejemplo 1: Un clásico — elegir una bebida
Implementemos un menú para la cafetería:
import java.util.Scanner;
public class CoffeeShop
{
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
System.out.println("Elige una bebida:");
System.out.println("1 - Espresso");
System.out.println("2 - Capuchino");
System.out.println("3 - Latte");
int choice = console.nextInt();
switch (choice)
{
case 1:
System.out.println("Has elegido un espresso.");
break;
case 2:
System.out.println("Has elegido un capuchino.");
break;
case 3:
System.out.println("Has elegido un latte.");
break;
default:
System.out.println("No existe esa bebida.");
break;
}
}
}
Qué sucede:
- El usuario introduce el número de la bebida.
- El valor de la variable choice se compara con cada case.
- Si hay coincidencia, se ejecuta el bloque correspondiente y luego break finaliza la ejecución de switch.
- Si no coincide con ninguno, se ejecuta default.
Ejemplo 2: Switch por cadenas
Dentro de switch no se pueden usar muchos tipos, pero las cadenas — ¡sí! Esto es útil para menús de comandos:
import java.util.Scanner;
public class CommandMenu
{
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
System.out.println("Introduce un comando (start, stop, pause):");
String command = console.nextLine();
switch (command)
{
case "start":
System.out.println("¡Inicio del programa!");
break;
case "stop":
System.out.println("Detención del programa.");
break;
case "pause":
System.out.println("Pausa.");
break;
default:
System.out.println("Comando desconocido.");
break;
}
}
}
Ten en cuenta: la comparación de cadenas en switch distingue mayúsculas y minúsculas. "Start" y "start" son cadenas distintas.
3. ¿Qué tipos admite el switch clásico?
En el switch clásico solo se pueden usar ciertos tipos:
- Tipos primitivos enteros: byte, short, char, int
- Enumeraciones: enum (hablaremos de ellas en la siguiente lección)
- Cadenas: String — la comparación es sensible a mayúsculas/minúsculas
No se pueden usar: boolean, float, double, arrays u objetos arbitrarios de clases (salvo enum y String).
Ejemplo con char
char grade = 'B';
switch (grade)
{
case 'A':
System.out.println("¡Excelente!");
break;
case 'B':
System.out.println("Bien.");
break;
case 'C':
System.out.println("Satisfactorio.");
break;
default:
System.out.println("Inténtalo de nuevo.");
break;
}
4. La obligatoriedad de break: ¿qué pasa si lo olvidas?
El error más común de los principiantes — olvidarse de break;. Veamos qué ocurre:
int day = 2;
switch (day)
{
case 1:
System.out.println("Lunes");
break;
case 2:
System.out.println("Martes");
case 3:
System.out.println("Miércoles");
break;
default:
System.out.println("Día desconocido");
break;
}
Resultado:
Martes
Miércoles
¿Por qué? Porque después de case 2 no hay break, y la ejecución «cae» al siguiente case (esto se llama fall-through). A veces es útil, pero la mayoría de las veces — un error.
5. Agrupar case: cuando varias opciones se comportan igual
Si para varios valores necesitas el mismo comportamiento, puedes ponerlos seguidos:
int month = 1;
switch (month)
{
case 12:
case 1:
case 2:
System.out.println("Invierno");
break;
case 3:
case 4:
case 5:
System.out.println("Primavera");
break;
case 6:
case 7:
case 8:
System.out.println("Verano");
break;
case 9:
case 10:
case 11:
System.out.println("Otoño");
break;
default:
System.out.println("Mes desconocido");
break;
}
Aquí: si month — 12, 1 o 2, el programa imprimirá "Invierno".
6. Comparación: switch vs if-else
| Escenario | if-else | switch |
|---|---|---|
| Muchas opciones | Cadena larga, menos legible | Conciso; todas las opciones se ven de un vistazo |
| Comparación de rangos | Se puede usar (if (x > 5 && x < 10)) | No; solo valores concretos |
| Tipos admitidos | Cualesquiera | Solo algunos (véase arriba) |
| Trampa con break | No | Sí; hay que vigilar siempre break |
7. Errores típicos al trabajar con switch
Error n.º 1: olvidaste break
La causa más común de bugs: te olvidaste de break — y el código ejecuta un case diferente al esperado.
Error n.º 2: tipo no admitido
Intentas usar double, float o boolean — el compilador dirá «no se puede».
Error n.º 3: cadenas con distinto uso de mayúsculas/minúsculas
El usuario escribió "Start", y tú esperas "start" — switch no funcionará. Mejor normaliza las cadenas a un mismo caso de antemano:
switch (command.toLowerCase())
{
case "start":
// ...
}
Error n.º 4: variable en case, no constante
Solo se permiten constantes en case. Si usas una variable — habrá error de compilación.
Error n.º 5: case duplicados
Dos valores case iguales — el compilador no lo permitirá.
GO TO FULL VERSION