1. 導入:なぜSwitch Expressionsが必要なのか
Javaの長い歴史の中で、従来のswitch文は「フォールスルー(breakを書き忘れると次のcaseまで実行される)」というバグの温床を抱えていました。また、if-elseの多用はネストを深くし、コードの可読性を著しく低下させます。Java 14で正式導入された「Switch Expressions(switch式)」は、これらを解決し、より簡潔で安全なコードを書くために不可欠な技術です。
2. 基礎知識:switch文とswitch式の違い
従来のswitch文は「文(Statement)」であり、副作用(変数の書き換えなど)を起こすためのものでした。対してswitch式は「値」を返します。
主な変更点は以下の通りです。
・アロー演算子(->):breakが不要になり、単一の式の結果を返せます。
・yieldキーワード:ブロック内で複雑な処理を行い、最後に値を返すために使用します。
・網羅性の強制:すべてのケースをカバーしなければコンパイルエラーになるため、漏れを防げます。
3. 実装/解決策:スマートな書き方
switch式を使う際は、代入先として直接利用するのが基本です。これにより、変数の初期化をより宣言的に記述できます。また、Sealed Classes(封印クラス)と組み合わせることで、特定の型のみを処理する堅牢なロジックを構築可能です。
4. サンプルプログラム
以下のコードは、曜日に基づいてタスクの状態を判定する例です。そのままコピーして動作を確認してみてください。
public class SwitchExample {
public static void main(String[] args) {
String day = “MONDAY”;
// switch式による値の代入
String taskStatus = switch (day) {
case “MONDAY”, “TUESDAY” -> “週の始まり、集中モード”;
case “WEDNESDAY” -> “折り返し地点”;
case “FRIDAY” -> “週末まであと少し”;
// ブロックを使う場合は yield で値を返す
case “SATURDAY”, “SUNDAY” -> {
System.out.println(“今日は休日です”);
yield “休息モード”;
}
// defaultは必須(網羅性のため)
default -> throw new IllegalArgumentException(“不正な値です: ” + day);
};
System.out.println(“現在のステータス: ” + taskStatus);
}
}
5. 応用・注意点:現場での活用ポイント
・網羅性の活用:enum型でswitch式を使う場合、すべてのenum定数を網羅すればdefault句を省略可能です。逆に言えば、後からenumに値を追加した際、コンパイルエラーとして漏れを検知できるため、非常に安全です。
・副作用の排除:switch式の中で外部の状態を変更するような処理(副作用)を混ぜるのは避けましょう。あくまで「値を計算して返す」ことに専念させるのが、バグを生まないクリーンコードの鉄則です。
・ネストの回避:switch式の中にさらにswitch式を書くと可読性が下がります。複雑な分岐が必要な場合は、責務をメソッドに切り出すことを検討してください。
新しいJavaの機能は、単なる「書き方の変化」ではなく「バグを防ぐための仕組み」です。ぜひ実務で積極的に活用してみてください。

コメント