Sentencia switch en Java.

Como la sentencia if, esta sentencia nos permite modificar la línea de ejecucion. En vez de usar una expresión boolean, usa una expresión byte, short, char, int o un tipo enumerado. A partir de la versión de java 1.7, también se puede usar String.

Formato de la sentencia Switch

switch (<expresión>) {
case <valor>:
	<lista de sentencias separadas por punto y coma>;
case <valor>:
	<lista de sentencias separadas por punto y coma>;
…
default:
	<lista de sentencias separadas por punto y coma>;
}

El tipo de la <expresión> y el <valor> debe coincidir. La cláusula default es opcional. Puede haber tantas cláusulas case como queramos. El <valor> no puede ser una expresión, sólo puede ser un literal.

Funcionamiento de la sentencia switch

Cuando se alcanza la sentencia switch, se evalúa la expresión. El resultado se compara con cada <valor> consecutivamente, hasta encontrar uno que coincida. Cuando coincide un <valor>, se ejecutan las instrucciones de esa cláusula y todas las de las cláusulas que le siguen.

Si queremos que sólo se ejecuten las instrucciones de una sola cláusula, se suele poner un “break” como última instrucción de <lista de sentencias separadas por punto y coma>, lo que hace que se termine la ejecución de la sentencia switch.

Formato de la sentencia Switch con break

switch (<expresión>) {
case <valor>:
	<lista de sentencias separadas por punto y coma>;
	break;
case <valor>:
	<lista de sentencias separadas por punto y coma>;
	break;
…
default:
 	<lista de sentencias separadas por punto y coma>;
}




Ejemplo sin break; “Dias de la semana que quedan”

En este ejemplo, ingresamos un día de la semana en inglés y nos enumeran los días de la semana que nos quedan para terminar esa semana.

package com.edu4java.javatutorials;
import javax.swing.JOptionPane;

public class SwitchExample {
	public static void main(String[] args) {
		String daysLeft = "";
		String weekDay = JOptionPane.showInputDialog("Ingresar el día de la semana (en ingles)");

		switch (weekDay.toUpperCase()) {
		case "SUNDAY":
			daysLeft = daysLeft + "Sunday ";
		case "MONDAY":
			daysLeft = daysLeft + "Monday ";
		case "TUESDAY":
			daysLeft = daysLeft + "Tuesday ";
		case "WEDNESDAY":
			daysLeft = daysLeft + "Wednesday ";
		case "THURSDAY":
			daysLeft = daysLeft + "Thursday ";
		case "FRIDAY":
			daysLeft = daysLeft + "Friday ";
		case "SATURDAY":
			daysLeft = daysLeft + "Saturday ";
		}
		JOptionPane.showMessageDialog(null, "Quedan \"" + daysLeft + "\" para terminar la semana");
	}
}

No utilizamos la cláusula optativa default. El método weekDay.toUpperCase() convierte todas las letras minúsculas presentes en el objeto String a mayúsculas, para que la comparación funcione aunque ingresen el dia de la semana en minúscula.

Ejemplo usando break “Menú de opciones”

Este es un caso típico donde nuestro programa tiene que hacer elegir al usuario entre varias opciones:

package com.edu4java.javatutorials;
import javax.swing.JOptionPane;

public class SwitchExample2 {
	public static void main(String[] args) {
		
		String menu = new String("Elija una opción: 1, 2, 3 o 4 \n");
		for (int i = 1; i <= 4; i++) {
			menu = menu + " opción " + i + "\n";
		}
		String option = JOptionPane.showInputDialog(menu.toString());
		switch (option) {
		case "1":
			JOptionPane.showMessageDialog(null, "Felicitaciones, ha elegido la opción 1");
			break;
		case "2":
			JOptionPane.showMessageDialog(null, "Felicitaciones, ha elegido la opción 2");
			break;
		case "3":
			JOptionPane.showMessageDialog(null, "Felicitaciones, ha elegido la opción 3");
			break;
		case "4":
			JOptionPane.showMessageDialog(null, "Felicitaciones, ha elegido la opción 4");
			break;
		default:
			JOptionPane.showMessageDialog(null, option + " no es una opción válida");
			break;
		}
	}
}

En este caso usamos break en cada cláusula case y podemos ver como se ejecuta sólo una opción. También usamos la cláusula default para indicar si la opción seleccionada no corresponde con ninguna opción válida.

Críticas al uso de sentencia Switch

El uso de la sentencia switch en diferentes lenguajes ha sido criticado por llevar a un código fuente que atenta contra el paradigma de programación estructurada. En programación orientada a objetos se refuerza esta crítica ya que existen patrones de diseño orientados a objetos que reemplazan la función que ofrece switch.

Los patrones de diseño son recomendaciones de prácticas que mejoran la calidad de los programas orientados a objetos.