Programación en Java/Sentencia switch

← Sentencia if-else Sentencia switch Operador if-else →


Vamos a desarrollar una calculadora totalmente elemental. Sin muchas características salvo de realizar operaciones aritméticas con dos operandos. Disponemos de una variable de tipo char que nos indicará que tipo de operación se debe efectuar. Realizamos la operación y mostramos el resultado en la pantalla. Después de luchar con las sentencias if-else nos quedó algo parecido a esto:

public class MiniCalculadora {
   public static void main(String args[]){
      int a = 1;
      int b = 1;
      char op = '/';
      System.out.print("El resultado es : ");
      if ( op == '+' ) {
          System.out.println( a + b);
      } else if ( op == '-') {
          System.out.println( a - b);
      } else if ( op == '*') {
          System.out.println( a * b);
      } else if ( op == '/') {
          System.out.println( a / b);
      }
   }
}

Ya nos alejamos bastante de las decisiones simples. Aquí tenemos de una cadena de sentencias if-else que realizan un selección múltiple. La condición general tiene mas dos alternativas. Tendremos que acudir a la sentencia switch que se encarga de este tipo de selección.

public class MiniCalculadora{
   public static void main(String args[]){
      int a = 1;
      int b = 1;
      char op = '/';
      System.out.print("El resultado es : ");
      switch ( op ) {
      case '+':
           System.out.println( a + b );
           break;
      case '-':
           System.out.println( a - b );
           break;
      case '*':
           System.out.println( a * b );
           break;
      case '/':
           System.out.println( a / b );
           break;
      default:
           System.out.println("error" );
           break;
      }
   }
}

La sentencia switch se encarga de estructurar una selección múltiple. Al contrario del enunciado if-else que sólo podemos indicar dos alternativas, maneja un número finito de posibilidades. La estructura general del enunciado switch es la siguiente:

 switch( expresión ) {
 case constante1:
      sentencia1;
      ...
      break;
      ...
 case constanteN:
      sentenciaN;
      ...
      break;
 default:
      sentencia;
      ...
      break
 }

El valor de la expresión y de las constantes tiene que ser de tipo char, byte, short o int. No hay lugar para booleanos, reales ni long porque, en la ejecución, todos los valores que incorporamos se transforman en valores de tipo int.

Al evaluar la expresión de switch, el intérprete busca una constante con el mismo valor. Si la encuentra, ejecuta las sentencias asociadas a esta constante hasta que tropiece con un break. La sentencia break finaliza la ejecución de esta estructura. Si no encuentra ninguna constante que coincida con la expresión, busca la línea default. Si existe, ejecuta las sentencias que le siguen. La sentencia default es opcional.

Volviendo a la mini calculadora, vemos como se organiza las distintas alternativas de acuerdo al valor de una constante char. Estas alternativas representan las distintas operaciones que están disponibles y solo se ejecutará una sola. Por ejemplo, si el valor del operador (en el programa figura op) es igual al signo de la suma , la sentencia switch ejecutará solamente la línea que corresponde con esta operación.

¿Que ocurre si cambiamos la variable op por algún carácter distinto a los especificados? Entra en juego la alternativa default y todas las setencias que le siguen. En este caso imprime por pantalla el mensaje "error". Si nos olvidamos de incorporar esta alternativa, no pasa nada. Ninguna sentencia dentro de la estructura switch se ejecutará.

Ya que hablamos de default, es conveniente mencionar que no es necesario que quede relegado al final de la estructura. Podemos situarla al comienzo , en el medio, en definitiva, en donde nos quede mas útil según la lógica que apliquemos o donde queramos.

     switch ( op ) {
     default :
          System.out.println("error");
          break;
     case '+':
          System.out.println( a + b );
          break;
           ...

En el ejemplo presentado, funciona de la misma manera un default al principio. Obviamente no debe existir mas de una alternativa default.

Las sentencias break son opcionales. Se utilizan con el propósito de separar las alternativas. Pero fieles a nuestro estilo de meternos en problemas decidimos que algunos break deben desaparecer. Probemos que ocurre con este código:

     switch ( op ) {
     case '+':
          System.out.println( a + b );
     case '-':
          System.out.println( a - b );
          break;
           ...

Es el mismo que el original, solo "olvidamos" de agregarle un break al final de la alternativa suma. Si cambiamos el valor de op por el carácter '+' y ejecutamos el programa, nos responde de esta manera:

  El resultado es : 2
  0

Nos dio los resultados de la suma y la resta. Al no tener un break en la suma, se pasó de largo y ejecuto la de abajo , que justamente era la resta.

En algunas circunstancias, el break está de mas. Es posible contruir una estructura en donde se ejecuten mas de una alternativa al mismo tiempo. Vemos un ejemplo:

 public class Lineas{
    public static void main(String args[]){
       int j = 2;
       switch (j) {
       case 5:
          System.out.println("********");
       case 4:
          System.out.println("********");
       case 3:
          System.out.println("********");
       case 2:
          System.out.println("********");
       case 1:
          System.out.println("********");
       }
    } 
 }

El programa tiene por objetivo listar un número dado de líneas. Se pueden dibujar hasta 5 líneas trazadas con el símbolo *. La cantidad dependerá del valor de la variable j. Por ejemplo, si j vale 2, activa la alternativa que tiene esta constante y como no tiene un break que la obstaculice sigue con la alternativa de abajo.