【Java学習|豆知識】Java 14以降の必須スキル!switch式とyieldでコードを劇的にクリーンにする方法

導入

Javaのコーディングにおいて、if-else文のネストが深くなり、「コードが読みにくい」「条件分岐の修正漏れが怖い」と感じたことはありませんか?Java 14で導入された「switch式」と、その中で値を返却するために使用する「yield」キーワードは、まさにその課題を解決するための強力な武器です。本記事では、この機能を正しく使いこなし、より堅牢で保守性の高いコードを書くためのポイントを解説します。

基礎知識

従来のswitch文は「文(Statement)」であり、変数を更新するために外部の変数に依存する必要がありました。しかし、「switch式(Expression)」は「値(Value)」を直接返すことができます。
yieldは、switch式の各ケース(ケースブロック)から値を返すために使用されます。アロー演算子(->)を使えばyieldは不要ですが、ブロック内で複雑な処理を行いたい場合には、yieldが必須となります。

実装/解決策

switch式でyieldを使用する場合、以下のルールを守る必要があります。
1. switch式全体が値を返すため、結果を代入する変数が必要です。
2. caseの中で波括弧({})を使用する場合、必ずyieldで値を返す必要があります。
3. すべてのパターンを網羅する必要があります(網羅性のチェック)。

サンプルプログラム

以下に、列挙型を使用して曜日ごとの業務ステータスを判定するサンプルコードを示します。

public class YieldExample {
public static void main(String[] args) {
String day = “MONDAY”;

// switch式を使ってステータスを判定
String status = switch (day) {
case “MONDAY”, “TUESDAY”, “WEDNESDAY” -> “週の初め:集中モード”;
case “THURSDAY”, “FRIDAY” -> {
// 複数の処理が必要な場合はブロックを使用
System.out.println(“週末に向けた追い込み”);
yield “週の後半:ラストスパート”;
}
case “SATURDAY”, “SUNDAY” -> “休日:リフレッシュ”;
// 網羅性が必要なため、想定外の入力には例外を投げるのが一般的
default -> throw new IllegalArgumentException(“無効な曜日です: ” + day);
};

System.out.println(“本日のステータス: ” + status);
}
}

応用・注意点

現場で活用する際の重要な注意点を2つ挙げます。

1. 網羅性の確保: switch式では、考えられるすべてのケースを網羅しないとコンパイルエラーになります。特に「Sealed Classes(封印クラス)」と組み合わせると、特定のサブクラスしか存在しないことをコンパイラが保証してくれるため、defaultラベルを省略でき、より安全なコードが書けます。
2. 副作用の回避: switch式はあくまで「値を生成する」ためのものです。caseブロック内で外部の状態を大きく変更するような副作用のある処理を詰め込みすぎると、バグの温床になります。処理が複雑になる場合は、メソッドを切り出して呼び出すようにしましょう。

モダンなJava開発において、これらの機能は「読みやすいコード」の基本です。ぜひ明日からの実装に取り入れてみてください。

コメント

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