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.

Author: Kaiido, 2013-05-23

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.

DESDE Java Docs

 391
Author: PSR,
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;
}
 30
Author: Grijesh Chauhan,
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.

 22
Author: Bohemian,
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;
 14
Author: kaljak,
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.

 5
Author: Colin D,
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 .

 4
Author: scottmrogowski,
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;
} 
 2
Author: Ankur Sharma,
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.

 1
Author: David_DD,
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);
    }
}
 1
Author: nullpointer,
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