380

私のコードでは、プログラムはユーザーが入力したテキストに応じて何かを行います。私のコードは次のようになります:

switch (name) {
        case text1: {
            //blah
            break;
        }
        case text2: {
            //blah
            break;
        }
        case text3: {
            //blah
            break;
        }
        case text4: {
            //blah
            break;
        }

ただし、ケース内のコードtext1text4同じです。したがって、次のようなものを実装することが可能かどうか疑問に思っていました

case text1||text4: {
            //blah
            break;
        }

||case ステートメントでは演算子が機能しないことはわかっていますが、使用できる同様のものはありますか。

4

15 に答える 15

22

要約: カンマ区切り

switch (name) {
    case text1 , text4  -> doX() ;
    case text2          -> doY() ;
    case text3          -> doZ() ;
}

式の切り替え

JEP 361: Switch Expressions in Java 14以降の統合により、複数の値の間にカンマを使用して、スイッチ ラベルの新しい形式を利用できます。

case text1, text4 -> {
     //blah
} 

または、回答の1つからデモを言い換えると、次のようになります:-

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);
    }
}
于 2018-09-08T18:28:36.377 に答える
7

ブラケットは不要です。やるだけ

case text1:
case text4:
  doSomethingHere();
  break;
case text2:
  doSomethingElse()
  break;

誰かが興味を持っている場合、これはケース フォールスルーと呼ばれます。break;これを行う能力が、 case ステートメントを終了する必要がある理由です。詳細については、ウィキペディアの記事http://en.wikipedia.org/wiki/Switch_statementを参照してください。

于 2013-05-23T07:15:47.680 に答える
5

他の人のfallthrough答えは良いものです。

ただし、別のアプローチは、case ステートメントの内容からメソッドを抽出し、各ケースから適切なメソッドを呼び出すだけです。

以下の例では、case 'text1' と case 'text4' の両方が同じように動作します。

switch (name) {
        case text1: {
            method1();
            break;
        }
        case text2: {
            method2();
            break;
        }
        case text3: {
            method3();
            break;
        }
        case text4: {
            method1();
            break;
        }

個人的には、このスタイルの case ステートメントを書くほうが保守しやすく、読みやすいと思います。特に、呼び出すメソッドにわかりやすい名前が付けられている場合はそうです。

于 2013-05-23T12:52:28.150 に答える
4

ケースの値は、同じエントリ ポイントを共有できるコードレスの "goto" ポイントです。

case text1:
case text4: {
// 何か
を壊す;
}

中括弧は冗長であることに注意してください。

于 2014-03-14T05:58:20.493 に答える