Control de flujo
if/else y switch
if / else if / else
La sintaxis es estándar C-like. Destacan los operadores lógicos con cortocircuito (&&, ||): si el primer operando determina el resultado, el segundo no se evalúa — útil para evitar NPE en cadenas
de condiciones.
// if / else if / else — igual que en otros lenguajes C-like
int nota = 75;
if (nota >= 90) {
System.out.println("Sobresaliente");
} else if (nota >= 70) {
System.out.println("Notable");
} else if (nota >= 50) {
System.out.println("Aprobado");
} else {
System.out.println("Suspenso");
}
// Operador ternario: condición ? valorTrue : valorFalse
String resultado = nota >= 50 ? "Aprobado" : "Suspenso";
// Operador AND (&&), OR (||), NOT (!) — cortocircuito
boolean esMayor = edad >= 18;
boolean tienePermiso = esMayor && !estaBloqueado; // si esMayor es false, no evalúa lo demás switch clásico
El switch de Java 8 acepta int (y sus wrappers), char,
String y enums. Importante: sin break, la ejecución continúa (fall-through) hacia el siguiente case — comportamiento que puede usarse intencionalmente o causar bugs sutiles.
// switch clásico en Java 8: sobre int, char, String o enum
String dia = "LUNES";
switch (dia) {
case "LUNES":
case "MARTES":
case "MIERCOLES":
case "JUEVES":
case "VIERNES":
System.out.println("Día laborable");
break; // sin break: "fall-through" al siguiente case
case "SABADO":
case "DOMINGO":
System.out.println("Fin de semana");
break;
default:
System.out.println("Día desconocido");
} switch con enums
El switch sobre enums es especialmente valioso porque el compilador puede advertir si falta algún
valor del enum (dependiendo del IDE/herramienta de análisis estático). Las referencias a los valores del enum
no llevan el nombre de la clase dentro del
switch.
// switch con enum: el compilador verifica que todos los casos están cubiertos
public enum Estado { PENDIENTE, PROCESANDO, COMPLETADO, CANCELADO }
Estado estado = Estado.PROCESANDO;
switch (estado) {
case PENDIENTE:
iniciarProcesamiento();
break;
case PROCESANDO:
verificarProgreso();
break;
case COMPLETADO:
notificarExito();
break;
case CANCELADO:
limpiarRecursos();
break;
// sin default necesario: todos los valores del enum están cubiertos
} Fall-through intencional
El fall-through es un patrón válido cuando múltiples casos comparten el mismo cuerpo. Agrupar los case vacíos seguidos del que tiene el cuerpo es más legible que repetir el código.
// Fall-through: si no hay break, la ejecución continúa en el siguiente case
int mes = 2;
int diasEnMes;
switch (mes) {
case 1: case 3: case 5: case 7:
case 8: case 10: case 12:
diasEnMes = 31;
break;
case 4: case 6: case 9: case 11:
diasEnMes = 30;
break;
case 2:
diasEnMes = 28; // ignorando años bisiestos
break;
default:
throw new IllegalArgumentException("Mes inválido: " + mes);
}