我们可以在 Java 中的同一 switch 语句中的另一个 case 中调用 "case" 吗?

Can we call a "case" inside another case in the same switch statement in Java?

我的意图是在同一个 switch 语句中调用另一个 case 中的两个 case,

switch (orderType) {
        case 1: 
            statement 1;
            break;
       case 2:
            statement 2;
            break;
       case 3:
             **call case 1;**
             **Call case 2;**
             break;
       default:
            break;`
}

我们可以在 Java 中做到吗?

不,您不能跳转到另一个 switch case 中的代码片段。但是,您可以将代码提取到一个可以从另一个案例中调用的自己的方法中:

switch (orderType) {
    case 1: 
        someMethod1();
        break;
    case 2:
        someMethod2();
        break;
    case 3:
        someMethod1();
        someMethod2();
        break;
    default:
        break;
}

void someMethod1() { ... }
void someMethod2() { ... }

你不能像这样调用另一个 case 块。不过,您可以做的是将这些块中的每一个都包装在一个方法中,然后重用它们:

private void doSomething() {
    // implementation
}

private void doSomethingElse() {
    // implementation
}

private void runSwitch(int order) {

    switch (orderType) {
           case 1: 
                doSomething();
                break;
           case 2:
                doSomethingElse();
                break;
           case 3:
                doSomething();
                doSomethingElse();
                break;
           default:
                break;
    }
}

虽然您不能直接影响 switch 个案例,但您可以从一个案例中调用 switch 的父方法并传递不同的参数。例如,

void foo(int param1, String param2, ...) {
    switch (param1) {
        case 0:
            foo(1, "some string");
            break;

        case 1:
            //do something
            break;

        default:
            break;
    }
}

在某些情况下你可以使用这个技巧:

switch (orderType) {
   case 3: 
        statement 3;
   case 2:
        statement 2;
   case 1:
        statement 1;
        break;
   default:
        break;`

}

如已接受的答案中所述,使用方法是最好的方法,但由于某些原因,如果您无法创建方法,这是另一种不使用方法的方法

boolean isBreakTheLoop = false, isCase2Required = false;
while(!isBreakTheLoop){
    switch (orderType) {
       case 1: 
            statement 1;
            if(isCase2Required){
               orderType = 2;
               break;
            }
            isBreakTheLoop = true;
            break;
       case 2:
            statement 2;
            isBreakTheLoop = true;
            break;
       case 3:
            orderType = 1;
            isCase2Required = true;
            break;
       default:
            isBreakTheLoop = true;
            break;
    }
}