Uso de dos valores para una instrucción de caso switch
En mi código, el programa hace algo dependiendo del texto introducido por el usuario. Mi código se ve así:
switch (name) {
case text1: {
//blah
break;
}
case text2: {
//blah
break;
}
case text3: {
//blah
break;
}
case text4: {
//blah
break;
}
Sin embargo, el código dentro de cases text1
y text4
es el mismo. Por lo tanto, me preguntaba si sería posible para mí implementar algo como
case text1||text4: {
//blah
break;
}
Sé que el operador ||
no funcionará en la instrucción case, pero hay algo similar que pueda usar.
9 answers
Puede usar tener ambas sentencias CASE
de la siguiente manera.
case text1:
case text4:{
//blah
break;
}
VEA ESTE EJEMPLO: El ejemplo de código calcula el número de días en un mes en particular:
class SwitchDemo {
public static void main(String[] args) {
int month = 2;
int year = 2000;
int numDays = 0;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
numDays = 31;
break;
case 4:
case 6:
case 9:
case 11:
numDays = 30;
break;
case 2:
if (((year % 4 == 0) &&
!(year % 100 == 0))
|| (year % 400 == 0))
numDays = 29;
else
numDays = 28;
break;
default:
System.out.println("Invalid month.");
break;
}
System.out.println("Number of Days = "
+ numDays);
}
}
Esta es la salida del código:
Number of Days = 29
FALLTHROUGH:
Otro punto de interés es la sentencia break. Cada declaración break termina la instrucción switch que encierra. El flujo de control continúa con la primera declaración después del bloque switch. Las declaraciones break son necesarios porque sin ellos, las sentencias en bloques de switch
fall through
: Todas las sentencias después de la etiqueta case coincidente se ejecutan en secuencia, independientemente de la expresión de las etiquetas de caso posteriores, hasta que se encuentre una sentencia break.
CÓDIGO DE EJEMPLO:
public class SwitchFallThrough {
public static void main(String[] args) {
java.util.ArrayList<String> futureMonths =
new java.util.ArrayList<String>();
int month = 8;
switch (month) {
case 1: futureMonths.add("January");
case 2: futureMonths.add("February");
case 3: futureMonths.add("March");
case 4: futureMonths.add("April");
case 5: futureMonths.add("May");
case 6: futureMonths.add("June");
case 7: futureMonths.add("July");
case 8: futureMonths.add("August");
case 9: futureMonths.add("September");
case 10: futureMonths.add("October");
case 11: futureMonths.add("November");
case 12: futureMonths.add("December");
default: break;
}
if (futureMonths.isEmpty()) {
System.out.println("Invalid month number");
} else {
for (String monthName : futureMonths) {
System.out.println(monthName);
}
}
}
}
Esta es la salida del código:
August
September
October
November
December
Usando cadenas en instrucciones switch
En Java SE 7 y versiones posteriores, puede utilizar un objeto String en el conmutador la expresión de la declaración. El siguiente código ejemplo, , muestra el número del mes, basado en el valor de la Cadena mes nombrado:
public class StringSwitchDemo {
public static int getMonthNumber(String month) {
int monthNumber = 0;
if (month == null) {
return monthNumber;
}
switch (month.toLowerCase()) {
case "january":
monthNumber = 1;
break;
case "february":
monthNumber = 2;
break;
case "march":
monthNumber = 3;
break;
case "april":
monthNumber = 4;
break;
case "may":
monthNumber = 5;
break;
case "june":
monthNumber = 6;
break;
case "july":
monthNumber = 7;
break;
case "august":
monthNumber = 8;
break;
case "september":
monthNumber = 9;
break;
case "october":
monthNumber = 10;
break;
case "november":
monthNumber = 11;
break;
case "december":
monthNumber = 12;
break;
default:
monthNumber = 0;
break;
}
return monthNumber;
}
public static void main(String[] args) {
String month = "August";
int returnedMonthNumber =
StringSwitchDemo.getMonthNumber(month);
if (returnedMonthNumber == 0) {
System.out.println("Invalid month");
} else {
System.out.println(returnedMonthNumber);
}
}
}
La salida de este código es 8.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-10 06:44:26
Puedes hacer como:
case text1:
case text4: {
//blah
break;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-23 06:12:37
Los valores case
son simplemente puntos "goto" sin código que pueden compartir el mismo punto de entrada:
case text1:
case text4:
//blah
break;
Tenga en cuenta que las llaves son redundantes.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-23 12:15:38
Solo hazlo
case text1: case text4:
do stuff;
break;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-23 06:13:41
Las fallthrough
respuestas de otros son buenas.
Sin embargo, otro enfoque sería extraer métodos del contenido de sus declaraciones de caso y luego llamar al método apropiado de cada caso.
En el siguiente ejemplo, tanto el caso 'text1' como el caso 'text4' se comportan igual:
switch (name) {
case text1: {
method1();
break;
}
case text2: {
method2();
break;
}
case text3: {
method3();
break;
}
case text4: {
method1();
break;
}
Personalmente encuentro este estilo de escritura de sentencias de caso más mantenible y ligeramente más legible, especialmente cuando los métodos que llamas tienen buenos nombres descriptivos.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-23 12:52:28
Los corchetes son innecesarios. Solo hazlo
case text1:
case text4:
doSomethingHere();
break;
case text2:
doSomethingElse()
break;
Si alguien tiene curiosidad, esto se llama un caso fallthrough. La capacidad de hacer esto es la razón por la que break;
es necesaria para terminar las sentencias case. Para obtener más información, consulte el artículo de wikipedia http://en.wikipedia.org/wiki/Switch_statement .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-23 07:15:47
Caer a través de enfoque es el mejor que siento.
case text1:
case text4: {
//Yada yada
break;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-12 11:21:54
Los valores de mayúsculas y minúsculas son solo puntos "goto" sin código que pueden compartir el mismo punto de entrada:
Case text1:
caso text4: {
//Hacer algo
break;
}
Tenga en cuenta que las llaves son redundantes.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-14 05:58:20
Con la integración de JEP 325: Switch Expressions (Preview) en JDK-12 early access builds, ahora se puede hacer uso de la nueva forma de la etiqueta switch como : -
case text1, text4 -> {
//blah
}
O para reformular la demo de una de las respuestas , algo así como: -
public class RephraseDemo {
public static void main(String[] args) {
int month = 9;
int year = 2018;
int numDays = 0;
switch (month) {
case 1, 3, 5, 7, 8, 10, 12 ->{
numDays = 31;
}
case 4, 6, 9, 11 ->{
numDays = 30;
}
case 2 ->{
if (((year % 4 == 0) &&
!(year % 100 == 0))
|| (year % 400 == 0))
numDays = 29;
else
numDays = 28;
}
default ->{
System.out.println("Invalid month.");
}
}
System.out.println("Number of Days = " + numDays);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-08 18:28:36