導入: なぜswitch文の書き方を変える必要があるのか
Javaエンジニアの皆さん、古い形式のswitch文で「break」を書き忘れてバグを生んだ経験はありませんか?また、複数のcaseで同じ処理をするために、わざわざ冗長にコードを並べていた経験もあるでしょう。Java 14以降(正式には17以降のLTS)で導入された「複数caseラベル」と「switch式」は、これらの課題を解消し、より安全で読みやすいコードを書くために非常に重要です。
基礎知識: switchラベルの進化
従来のswitch文では、ひとつのcaseに対して一つの値しか指定できず、複数の値に同じ処理を適用するには「フォールスルー(breakをあえて書かずに次のcaseへ流す)」という手法をとる必要がありました。しかし、これは可読性を下げ、意図しないバグの温床になりがちです。
新しい構文である「case A, B ->」形式では、カンマ区切りで複数の値を列挙でき、かつ矢印演算子(->)を使うことで、特定のブロックのみが実行されるようになります。これにより、breakの記述が不要となり、コードの安全性が劇的に向上しました。
実装/解決策: 複数caseラベルの活用
この機能を利用するには、従来の「:(コロン)」ではなく「->(矢印)」を使用します。これにより、そのラベルにマッチしたときだけ右側の処理が実行され、自動的にswitch文を抜けるため、breakを記述する必要がありません。
サンプルプログラム
以下のコードは、曜日のタイプ(平日・休日)を判定する実用的な例です。
public class SwitchExample {
public static void main(String[] args) {
String day = “SATURDAY”;
// switch式として値を直接変数に代入することも可能です
String type = switch (day) {
// 複数caseラベルをカンマでつなぐことで、簡潔に記述できます
case “MONDAY”, “TUESDAY”, “WEDNESDAY”, “THURSDAY”, “FRIDAY” -> “平日”;
// 休日をまとめて判定
case “SATURDAY”, “SUNDAY” -> “休日”;
// デフォルトの処理も必須(網羅性チェックのため)
default -> throw new IllegalArgumentException(“無効な曜日です: ” + day);
};
System.out.println(day + “は” + type + “です。”);
}
}
応用・注意点: 現場で役立つポイント
1. 網羅性の確保: switch式として使う場合、すべてのケースを網羅する必要があります。もし列挙型(enum)やsealed classを使用している場合、漏れがあるとコンパイルエラーになるため、メンテナンス性が非常に高いです。
2. yieldの活用: 「->」の右側に複雑な処理を書きたい場合は、ブロック({})で囲み、最後に「yield」を使って値を返却してください。これにより、一行では収まらないロジックもswitch内で完結できます。
3. 既存コードとの混在: 古い「case :」形式と新しい「case ->」形式を同一のswitch文内に混ぜることはできません。プロジェクト全体で新しい構文への移行を検討することをお勧めします。
このTipsを活用して、堅牢で美しいコードベースを目指しましょう!

コメント