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";
};
Javaswitch 式は「必ず値を返す」必要があるため、
すべてのパターンを網羅するか、default を書く必要があります。
複雑な処理をしたいときは yield を使う
→ では 1 行しか書けない
-> の右側は「1 つの式」でなければなりません。
複数行の処理をしたい場合は、ブロック {} と yield を使います。
var message = switch (score) {
case 100 -> "満点!";
case 90, 80 -> "よくできました";
default -> {
var msg = "点数は " + score + " です";
yield msg; // ブロックから値を返す
}
};
Javayield は「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;
}
};
Javaswitch 式を使うときの注意点
1. すべてのパターンを網羅する必要がある
switch 式は「値を返す」ので、
どの case に入っても必ず値が返る必要があります。
網羅できない場合は default を書きます。
2. null を渡すと NullPointerException
switch (value) { ... }
Javaここに null を渡すと NPE になります。
null を扱いたい場合は、事前にチェックするか、Objects.requireNonNull を使うのが安全です。
まとめ:switch 式を自分の言葉で説明するなら
あなたの言葉でまとめると、こうなります。
「switch 式は、Java 14 以降で使える“値を返す switch”。-> を使うことで break が不要になり、フォールスルーも起きず、安全で読みやすい。
複数行の処理は yield を使い、すべてのパターンを網羅する必要がある。
従来の switch より短く、明確で、バグが入りにくい構文。」
