Programmingバックエンド開発者

Javaにおけるswitch式とは何ですか?従来のswitchとどのように異なり、使用時の注意点は何ですか?

Hintsage AIアシスタントで面接を突破

回答。

問題の歴史:

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は式になり、結果を変数に代入できるようになりました。
  • 新しい構文は読みやすさを向上させ、忘れたbreakを防ぎます。
  • 複数のラベルのサポート(case A, B -> ...)。

隠れた質問。

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; };

一般的なエラーとアンチパターン

  • null非許容タイプでdefaultがないとコンパイルエラーになります。
  • defaultの外でnullを処理しようとするとNullPointerExceptionが発生します。
  • 大量のネストを持つswitchの使用はポリモーフィズムの代わりになるべきです。

日常の例

ネガティブケース

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 -> "処理中"; };

利点:

  • 包括的な分析 — エラーが少ない。
  • コードがコンパクトで読みやすい。

欠点:

  • Java 14以上と現代的な構文の知識が必要です。