Un condicional es una estructura que elige qué código ejecutar según una condición.
Hasta ahora, nuestros programas empezaban en la primera línea y ejecutaban todas las instrucciones hasta el final, sin desviarse.
Pero el software real necesita tomar decisiones. Necesitamos que el código reaccione de forma distinta si el usuario es mayor de edad o no, si una contraseña es correcta o si hoy es fin de semana.
Hoy vamos a ver las estructuras de control condicionales. Y prepárate, porque si aprendiste Java hace años, te vas a llevar una alegría con el nuevo Switch.
La sentencia if y else
Es la estructura fundamental de la programación. “Si pasa esto, haz aquello”.
La sintaxis en Java es idéntica a C, C++ o C#. Necesitamos una condición que evalúe a boolean (verdadero o falso).
int bateria = 15;
if (bateria < 20) {
System.out.println("¡Batería baja! Conecta el cargador.");
} else {
System.out.println("Batería suficiente.");
}Anidamiento y else if
Podemos encadenar tantas condiciones como queramos. Java evaluará en orden y ejecutará solo el primer bloque cuya condición sea cierta.
int nota = 8;
if (nota >= 9) {
System.out.println("Sobresaliente");
} else if (nota >= 7) {
System.out.println("Notable");
} else if (nota >= 5) {
System.out.println("Aprobado");
} else {
System.out.println("Suspenso");
}Las llaves son tus amigas
En Java, si el bloque if solo tiene una línea, las llaves {} son opcionales.
Consejo de veterano: PONLAS SIEMPRE. Omitirlas es la causa de bugs famosos (como el Apple’s goto fail).
El switch clásico (statement)
Cuando tenemos que comprobar una misma variable contra muchos valores distintos, usar if-else-if-else se vuelve sucio y lento de leer.
Para eso existe el switch.
Históricamente, el switch en Java (y en C++) ha tenido mala fama por ser verboso y propenso a errores. Veamos cómo era la forma “clásica” (y que aún funciona):
int diaSemana = 3;
String nombreDia;
switch (diaSemana) {
case 1:
nombreDia = "Lunes";
break;
case 2:
nombreDia = "Martes";
break;
case 3:
nombreDia = "Miércoles";
break;
default:
nombreDia = "Día inválido";
break;
}El problema del “fall-through”
Fíjate en los break. Si se te olvida poner uno, Java seguirá ejecutando el código del siguiente caso. Esto se llama fall-through. A veces es útil, pero el 99% de las veces es un bug que te va a costar encontrar.
La expresión switch moderna (Java 14+)
Java 14 trajo una de las mejoras de sintaxis más esperadas: las Switch Expressions.
Esto cambia dos cosas fundamentales:
- Sintaxis de flecha (
->): Más limpia y sin necesidad debreak. Evita el fall-through accidental. - Es una Expresión: Significa que el
switchdevuelve un valor. Podemos asignarlo directamente a una variable.
Mira qué diferencia con el ejemplo anterior:
int diaSemana = 3;
// Asignamos directamente el resultado del switch a la variable
String nombreDia = switch (diaSemana) {
case 1 -> "Lunes";
case 2 -> "Martes";
case 3 -> "Miércoles";
case 4, 5 -> "Jueves o Viernes"; // Podemos agrupar casos
default -> "Día inválido";
}; // Nota el punto y coma final, ¡es una asignación!Mucho más elegante, ¿verdad?
La palabra clave yield
A veces, dentro de un caso del nuevo switch, necesitas hacer más cosas antes de devolver el valor (calcular algo, un log, etc.). En ese caso, usamos llaves {} y la palabra clave yield para devolver el valor.
String tipoDia = switch (diaSemana) {
case 1, 2, 3, 4, 5 -> {
System.out.println("A trabajar...");
yield "Laborable"; // Devuelve "Laborable"
}
case 6, 7 -> "Fin de semana";
default -> throw new IllegalArgumentException("Día imposible: " + diaSemana);
};Exhaustividad:
Cuando usas switch como expresión (para devolver valor), debes cubrir todos los casos posibles. Si usas un int, necesitas un default. Si usas un Enum y cubres todas las opciones, el default no es necesario (otra ventaja enorme de los Enums).