Setencias de Decisión en Java (switch)
En nuestro anterior post hemos visto las Setencias de Decisión en Java (if-then, if-then-else), el día de hoy completaremos este tema con la sentencia Switch. Recuerda que las sentecias de control nos permiten ejecutar bloques específicos de código basados en una decisión. Sin embargo hay una diferencia sustancial entre la sentencia switch y las demás sentencias de decisión que veremos a continuación.
Condiciones mutuamente excluyentes
Al igual que if-then
, if-then-else
podemos construir una serie de condiciones las cuales permitirán que solamente un bloque de código se ejecute. Veamos el siguiente ejemplo.
public class Test
{
public static void main(String[] args) {
int day = 3;
String dayName;
switch (day) {
case 1:
dayName = "Monday";
break;
case 2:
dayName = "Tuesday";
break;
case 3:
dayName = "Wednesday";
break;
case 4:
dayName = "Thursday";
break;
case 5:
dayName = "Friday";
break;
case 6:
dayName = "Satudary";
break;
case 7:
dayName = "Sunday";
break;
default:
dayName = "Invalid day";
}
System.out.println(dayName);
}
}
Al ejecutar este código se obtiene como resultado
Wednesday
Esto es así ya que la variable day es igual a 3 y cumple la condición case 3. Además cada bloque case termina con la sentencia break
que impide que los bloques subsecuentes se ejecuten. Nota también que el útlimo bloque es default
. Este bloque es necesario ya que si no se coloca el programa no compilará. Si no se cumple ninguna de las condiciones la variable será inicializada al valor por defecto que en este caso es "Invalid day".
Condiciones no excluyentes
A diferencia de las sentencias if-then
, if-then-else
, la sentencia switch
permite que el flujo de ejecución pueda seguir por varios caminos y no solamente por uno. Veamos el sigueinte ejemplo.
public class Test
{
public static void main(String[] args) {
int years = 4;
int bonus = 0;
switch (years) {
case 5:
bonus += 1000;
case 4:
bonus += 0;
case 3:
bonus += 500;
case 2:
bonus += 0;
case 1:
bonus += 100;
default:
break;
}
System.out.println("Accumulated Bonus: " + bonus);
}
}
Al ejecutar este código se obtiene como resultado
Accumulated Bonus: 600
El objetivo de este programa es calcular el bono acumulado que tendría una persona que trabaja en una empresa en la cuál al primera año recibe 100 dólares, al tercer año recibe 500 y al quinto año recibe 1000. Como puedes notar una persona que lleva cuatro años habrá obtenido un bono acumulado de 600 dólares tal y como lo muestra la salida del programa. Esto es así, dado que como habrás notado la condición entra en el statement case 4 el cuál suma a la variable bonus 0 USD. Dado que este bloque no tiene break el programa seguirá ejectando los demás bloques sin importar el valor de la expresión de las etiquetas case
. Es decir, habrá sumado después a la variable bonus 0 + 500 + 0 + 100. Ten en cuenta que el bloque switch terminará su ejecución en la primera sentencia break
que encuentre.
Múltiples etiquetas case
Sentencias case con el mismo bloque de código se pueden agrupar. Supongamos ahora que el gobierno dará un incentivo a las madres por sus hijos menores de 6 años. Por un hiijo de 1 o 2 años dará un incentivo de 100 USD, por un niño de 3 años dará 500, por un niño de 4 dará 1000 y por uno de 5 dará 2000. Dado esto podemos escribir el siguiente programa.
public class Test
{
public static void main(String[] args) {
int age = 1;
int bonus = 0;
switch (age) {
case 1:
case 2:
bonus = 100;
break;
case 3:
bonus = 500;
break;
case 4:
bonus = 1000;
break;
case 5:
bonus = 2000;
break;
default:
break;
}
System.out.println("Incentive: " + bonus);
}
}
Observa que el cambio es tan sutil como elegante. Dado que el primer y segundo año se recibe lo mismo por hijo no hace falta colocar la misma condición en el bloque case 2. La salida del programa será la siguiente tomando la variable age como la edad del menor.
Incentive: 100
Finalmente ten en cuenta que una sentencia switch puede evaluar un valor entero, un valor enumerado o un string. Hasta pronto!.