Setencias de Decisión en Java (switch)

2020-04-17 Java

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-thenif-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!.

Si te ha gustado este artículo puedes invitarme a tomar una taza de café

Acerca de Darío Rivera

Author

Ingeniero de desarrollo en PlacetoPay , Medellín. Darío ha trabajado por más de 6 años en lenguajes de programación web especialmente en PHP. Creador del microframework DronePHP basado en Zend y Laravel.

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.