Java | Java 詳細・モダン文法:言語仕様詳細 – switch 式(Java 14+)

Java Java
スポンサーリンク

switch 式とは何か(Java 14 以降の新しい switch)

Java 14 以降では、switch が「文(statement)」だけでなく「式(expression)」としても使えるようになりました。
これにより、switch値を返せる ようになり、コードが短く、安全で、読みやすくなります。

従来の switch は「処理を分岐するだけ」でしたが、
新しい switch 式は「分岐して、その結果を値として返す」ことができます。

var result = switch (day) {
    case MONDAY, TUESDAY -> "平日";
    case SATURDAY, SUNDAY -> "休日";
};
Java

このように、switch の結果をそのまま変数に代入できます。
これが「switch 式」の最大の特徴です。


従来の switch の問題点を理解する

break 書き忘れ問題

従来の switch は、break を書き忘れると「フォールスルー(次の case に流れる)」が起きてしまいます。

switch (day) {
    case MONDAY:
        result = "平日";
        // break を忘れると次の case に流れる!
    case TUESDAY:
        result = "平日";
}
Java

初心者が最もつまずくポイントでした。

値を返すのが面倒

従来の switch は「文」なので、値を返すには変数を先に宣言しておく必要がありました。

String result;
switch (day) {
    case MONDAY:
        result = "平日";
        break;
    case SATURDAY:
        result = "休日";
        break;
    default:
        result = "不明";
}
Java

コードが冗長で、ミスも起きやすい構造でした。


switch 式の基本構文(→ を使う)

break が不要で、安全な構文

Java 14 以降の switch 式では、-> を使います。

var result = switch (day) {
    case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "平日";
    case SATURDAY, SUNDAY -> "休日";
};
Java

ここで重要なのは、

  • break が不要
  • フォールスルーが起きない
  • 各 case が「値を返す」

という点です。

default も値を返す

var result = switch (value) {
    case 1 -> "one";
    case 2 -> "two";
    default -> "other";
};
Java

switch 式は「必ず値を返す」必要があるため、
すべてのパターンを網羅するか、default を書く必要があります。


複雑な処理をしたいときは yield を使う

→ では 1 行しか書けない

-> の右側は「1 つの式」でなければなりません。

複数行の処理をしたい場合は、ブロック {}yield を使います。

var message = switch (score) {
    case 100 -> "満点!";
    case 90, 80 -> "よくできました";
    default -> {
        var msg = "点数は " + score + " です";
        yield msg; // ブロックから値を返す
    }
};
Java

yield は「switch 式の結果として返す値」を指定するキーワードです。


switch 式のメリットを深掘りする

1. フォールスルーがなく、安全

従来の switch の最大の罠「break 書き忘れ」が完全に消えます。

case A -> ...
case B -> ...
Java

この構文では、絶対に次の case に流れません。

2. 値を返すので、コードが短くなる

従来のように「変数を先に宣言して、switch の中で代入する」必要がありません。

var label = switch (status) {
    case OK -> "成功";
    case ERROR -> "失敗";
};
Java

読みやすさが圧倒的に向上します。

3. パターンマッチングとの相性が良い(将来性)

Java は今後、switch に「パターンマッチング」をどんどん追加していきます。

switch 式はその基盤となる構文なので、
今のうちに慣れておくと、将来の Java をスムーズに使いこなせます。


switch 式の実践例

例1:Enum の分類

enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }

var type = switch (day) {
    case MON, TUE, WED, THU, FRI -> "平日";
    case SAT, SUN -> "休日";
};
Java

例2:文字列の分類

var result = switch (command) {
    case "start" -> "開始します";
    case "stop" -> "停止します";
    default -> "不明なコマンドです";
};
Java

例3:複数行の処理(yield)

var message = switch (age) {
    case 0, 1 -> "赤ちゃん";
    case 2, 3, 4, 5 -> "幼児";
    default -> {
        var category = "年齢: " + age;
        yield category;
    }
};
Java

switch 式を使うときの注意点

1. すべてのパターンを網羅する必要がある

switch 式は「値を返す」ので、
どの case に入っても必ず値が返る必要があります。

網羅できない場合は default を書きます。

2. null を渡すと NullPointerException

switch (value) { ... }
Java

ここに null を渡すと NPE になります。

null を扱いたい場合は、事前にチェックするか、
Objects.requireNonNull を使うのが安全です。


まとめ:switch 式を自分の言葉で説明するなら

あなたの言葉でまとめると、こうなります。

「switch 式は、Java 14 以降で使える“値を返す switch”。
-> を使うことで break が不要になり、フォールスルーも起きず、安全で読みやすい。
複数行の処理は yield を使い、すべてのパターンを網羅する必要がある。
従来の switch より短く、明確で、バグが入りにくい構文。」

タイトルとURLをコピーしました