【Java学習|豆知識】Java 14から導入されたswitch式における「yield」と「return」の決定的な違い

導入

Java 14で正式導入された「switch式」は、従来のswitch文よりもコードを簡潔かつ安全に記述できる強力な機能です。しかし、現場では「switch式から値を返すためのyield」と、メソッドから値を返す「return」を混同して混乱を招くケースが見受けられます。この違いを明確に理解することは、可読性の高いコードを書くための第一歩です。

基礎知識

まず、switch文switch式の違いを整理しましょう。
switch文は、caseラベルに従って処理を実行する「制御フロー」です。一方、switch式は、その名の通り「式(expression)」であり、評価された結果として値を返します。

ここで登場するのが yield です。yieldは、switch式のブロック内で値を返すために使用される予約語です。これに対し、returnは、現在のメソッドそのものを終了させて呼び出し元へ値を返します。つまり、yieldはswitch式の終了、returnはメソッドの終了という役割の棲み分けがあります。

実装/解決策

switch式で値を返す際は、`->`(アロー演算子)を用いたラムダ形式が一般的ですが、複雑な処理が必要な場合はブロック `{}` を使用します。このブロック内で値を決定する際に yield が必要となります。

注意すべきは、yieldはswitch式の中でしか使えないという点です。メソッド全体を終了させたい場合は、switch式の外でreturnを使用する必要があります。

サンプルプログラム

以下のコードは、入力された数値に応じて文字列を生成するサンプルです。switch式でのyieldと、メソッドのreturnを使い分けています。


public class SwitchExample {
public static void main(String[] args) {
System.out.println(getDescription(2));
}

public static String getDescription(int number) {
// switch式の結果をString変数に代入
String result = switch (number) {
case 1 -> "ワン";
case 2 -> {
// 複雑な処理を行った後に値を返す場合はyieldを使用
System.out.println("2が選択されました");
yield "ツー";
}
default -> "その他";
};

// メソッド全体の終了としてreturnを使用
return "結果は: " + result;
}
}

応用・注意点

現場での開発において陥りやすい罠として、yieldの書き忘れがあります。ブロック `{}` を使用した場合、コンパイラは値を返す必要があることを検知しますが、すべてのパスでyieldが呼ばれることを保証しなければなりません。

また、sealed classes(封印クラス)と組み合わせる場合、switch式は網羅性をチェックしてくれます。もしenumやsealedクラスの全パターンを網羅していない場合、コンパイルエラーとなります。これにより「caseの書き漏らし」というバグを未然に防ぐことができます。

まとめ:
yield:switch式から値を返すためのもの。
return:メソッドを終了して値を返すためのもの。
この役割を意識するだけで、意図しないメソッド終了バグや、switch式のコンパイルエラーに悩まされることは減るはずです。ぜひ日々のコードで活用してください。

コメント

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