問題の歴史:
Java 12まではswitch文はステートメントとしてのみ使用されていましたが、Java 12/14のリリースでswitch式(switch expression)が登場し、構文と機能が拡張されました。switch式は、より簡潔で表現力豊かなコードを書くために設計されています。
問題:
従来のswitchはよくエラーを引き起こします。忘れたbreakはフォールスルーを引き起こし、ケースが多い場合の可読性が低下し、結果を直接式に返すことができず、値の包括的なチェックができません。
解決策:
switch式は値を返すことができ、アロー構文を使用し、コンパイル時に包括的な分析をサポートし、defaultを通じてnullを処理します。構文は以下の通りです:
String result = switch(day) { case MONDAY, FRIDAY -> "Workday"; case SATURDAY, SUNDAY -> "Weekend"; default -> throw new IllegalArgumentException(); };
主な特徴:
switchはenum、文字列、nullと動作できますか?
enumはJava 5から、文字列はJava 7から動作します。nullはdefaultを通じてのみ処理され、そうでない場合はNPEが発生します。
switch(day) { // day == null default: System.out.println("null"); } // 動作します
switch式でenumのすべてのバリエーションを実装しないとどうなりますか?
コンパイラはすべての値に対してdefaultまたは実装を要求します。これがない場合はコンパイルエラーになります。
新しいタイプのswitch式でbreakを使用できますか?
アロー形式ではbreakは不要です。ブロック(case X -> { ... })を使用する場合、値を返すためにyieldを使用できます:
int num = switch(x) { case 1 -> 10; case 2 -> { yield 20; } default -> 0; };
breakなしでintの従来のswitch:
switch(type) { case 1: actionA(); case 2: actionB(); // type==1またはtype==2のときに呼び出される }
利点:
欠点:
enumと結果をマッピングするために新しいswitch式を使用:
String status = switch(orderStatus) { case PAID -> "支払い済み"; case CANCELED -> "キャンセル済み"; default -> "処理中"; };
利点:
欠点: