「Javaのyieldって最近聞くけど、何に使うの?」
「returnやbreakとどう違うのか、いまいち分からない…」
「switch式が便利になったらしいけど、具体的な書き方が知りたい」
もし、あなたがこのようにお考えなら、この記事がきっと役に立ちます。
私もJava 14でyield
が導入された当初は、従来のswitch
文との違いに少し戸惑った経験があります。しかし、その仕組みと利点を理解してからは、コードの可読性が劇的に向上し、バグの少ない安全なプログラムを書けるようになりました。
この記事では、Javaのyield
について知りたい方に向けて、以下の内容を分かりやすく解説します。
yield
の基本的な意味と役割yield
が導入された背景とreturn
との明確な違いswitch
式での具体的な使い方とコードサンプル
この記事を最後まで読めば、あなたはyield
を正しく理解し、明日からのコーディングで自信を持って活用できるようになるでしょう。
Javaのyieldとは?

Javaのyield
は、switch
式の中から値を返すために使われるキーワードです。Java 14でswitch
文が「式」として拡張された際に、プレビュー機能として導入され、Java 14で正式な機能となりました。
これまでのswitch
は「文(Statement)」であり、処理を実行するだけでした。しかし、新しいswitch
「式(Expression)」は、処理の結果として値を生成できます。yield
は、その値を「産出する」または「提供する」という役割を担います。
このyield
の登場により、コードがより簡潔で安全になりました。
yieldが登場した背景(Java 14で導入された理由)
yield
と新しいswitch
式がなぜ導入されたのかを理解するために、従来のswitch
文が抱えていた課題を見てみましょう。
従来のswitch
文には、主に2つの課題がありました。
- breakの書き忘れによるバグcaseごとにbreakを書き忘れると、処理が次のcaseに突き抜けてしまう「フォールスルー」という現象が起こります。これは意図しないバグの温床として、多くの開発者を悩ませてきました。
- コードの冗長性switch文の結果を外部の変数に代入する場合、まず変数を宣言し、各caseで代入処理を書く必要がありました。これにより、コードが長くなり、可読性が低下する傾向があったのです。
これらの課題を解決し、より安全で表現力豊かなコードを書けるようにするために、switch
式とyield
が導入されました。switch
式では、すべてのcase
を網羅することが強制されるため、バグが入り込む余地が減ります。
yieldと従来のreturnとの違い
yield
とreturn
は、どちらも値を返すキーワードですが、その役割の範囲がまったく異なります。この違いを理解することが、yieldを使いこなす上で非常に重要です。
return
: メソッド全体の処理を終了し、値を呼び出し元に返します。return
が実行された時点で、そのメソッドは完全に終了です。yield
:switch
式の中から値を返すだけで、メソッドの処理は終了しません。switch
式の評価が完了した後も、メソッド内の後続の処理は続行されます。
つまり、スコープ(影響範囲)が違うと覚えておくと良いでしょう。return
はメソッド全体、yield
は自身が含まれるswitch
式だけが対象です。
yieldの具体的な使い方

それでは、yield
をどのように使うのかを具体的に見ていきましょう。yield
はswitch
式の中で、特定のcase
が返す値を指定するために使用します。
switch式とyieldの組み合わせ例
yield
は、case
の処理が複数行にわたる場合に使われるのが一般的です。case
の後にコロン:
を書き、波括弧{}
で囲んだブロック内で処理を記述し、最後にyield
で返す値を指定します。
// 曜日(enum)に基づいてメッセージを返す例
DayOfWeek day = DayOfWeek.MONDAY;
String message = switch (day) {
case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "平日です。頑張りましょう!";
case SATURDAY, SUNDAY -> {
System.out.println("休日が検出されました。");
// 何か別の処理...
yield "休日です。ゆっくり休みましょう!";
}
// defaultは不要 (enumの全パターンを網羅しているため)
};
System.out.println(message);
この例では、土曜日または日曜日の場合に、コンソールへの出力処理を行った後、yield
を使って文字列を返しています。一方、平日のcase
のように処理が1行で済む場合は、アロー->
を使ってより簡潔に書くことが可能です。
従来のswitch文との違いを比較
同じ処理を従来のswitch
文で書いた場合と比較すると、yield
を使ったswitch
式のメリットがより明確になります。
従来のswitch
文を使ったコード:
DayOfWeek day = DayOfWeek.MONDAY;
String message; // 外部で変数を宣言
switch (day) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
message = "平日です。頑張りましょう!";
break; // breakが必須
case SATURDAY:
case SUNDAY:
System.out.println("休日が検出されました。");
// 何か別の処理...
message = "休日です。ゆっくり休みましょう!";
break; // breakが必須
default:
// 本来は到達しないが、念のため例外処理
throw new IllegalStateException("不正な曜日: " + day);
}
System.out.println(message);
switch
式とyield
を使ったコード(再掲):
DayOfWeek day = DayOfWeek.MONDAY;
String message = switch (day) { // 式なので直接変数に代入できる
case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "平日です。頑張りましょう!";
case SATURDAY, SUNDAY -> {
System.out.println("休日が検出されました。");
yield "休日です。ゆっくり休みましょう!"; // breakは不要
}
};
System.out.println(message);
比較すると、switch
式とyield
を使ったコードの方が、以下の点で優れていることが分かります。
break
が不要:break
の書き忘れによるバグの心配がありません。- コードが簡潔: 変数を
switch
の外で宣言する必要がなく、直接代入できるため、全体的にすっきりしています。 - 網羅性の保証:
enum
の全パターンをcase
で網羅している場合、default
が不要になります。もし網羅していないとコンパイルエラーになるため、記述漏れを防げます。
このように、yieldを使うことで、より安全で読みやすいコードを実現できるのです。
実際のコードサンプルで理解する
もう少し実践的な例を見てみましょう。HTTPステータスコードに応じて、クライアントに返すメッセージのカテゴリを判定する処理を考えます。
int statusCode = 200;
String category = switch (statusCode) {
case 200, 201, 204 -> "成功";
case 400, 401, 403, 404 -> {
// 400番台のエラーはログに記録するなどの追加処理
logError("クライアントエラーが発生しました: " + statusCode);
yield "クライアントエラー";
}
case 500, 503 -> {
// 500番台のエラーはより詳細なログを残す
logServerError("サーバーエラーが発生しました: " + statusCode, new Exception());
yield "サーバーエラー";
}
default -> {
// 想定外のコードは不明として扱う
logWarning("不明なステータスコード: " + statusCode);
yield "不明";
}
};
System.out.println("ステータスカテゴリ: " + category);
このコードでは、yield
を使うことで、各case
内でログ出力のような副作用を伴う処理を実行しつつ、最終的な値をswitch
式の結果として返す、という柔軟な記述ができています。
yieldを使うときの注意点

yield
は非常に便利な機能ですが、使う際にはいくつか知っておくべき注意点が存在します。これらを理解せずに使うと、予期せぬコンパイルエラーにつながる可能性があります。
switch「文」では使えないことに注意
最も重要な注意点は、yield
はswitch
「式」専用のキーワードである、という点です。値を返さない従来のswitch
「文」の構文の中でyield
を使おうとすると、コンパイルエラーになります。
コンパイルエラーになる例:
int num = 1;
// これは値を返さない「文」なので、yieldは使えない
switch (num) {
case 1:
System.out.println("1です");
yield 1; // ここでコンパイルエラー!
break;
default:
System.out.println("その他");
break;
}
switch
が式として扱われるのは、switch
ブロック全体が変数の代入やreturn
の対象になっている場合です。yield
は、そのswitch
式が返す値を指定するためだけに存在します。
可読性の観点からの使い分け
switch
式には、yield
を使う構文と、アロー->
を使う構文の2種類があります。どちらを使うべきか、可読性の観点から使い分けるのが良いでしょう。
- アロー (->) を使うべきケース:caseの処理が値を返すだけのシンプルな1行で終わる場合。こちらの方が圧倒的に簡潔です。case MONDAY -> "平日";
- yield を使うべきケース:値を返す前に、ログ出力など複数の処理を実行する必要がある場合。波括弧{}で処理ブロックを作り、その中でyieldを使います。case SATURDAY -> { System.out.println("ログ出力"); yield "休日"; }
処理内容に応じて適切な構文を選択することで、コードの意図が伝わりやすくなります。
将来のJavaバージョンとの互換性
yield
はJava 14で正式に導入された機能です。したがって、プロジェクトで使用しているJavaのバージョンが13以前の場合、yield
およびswitch
式は利用できません。
チームで開発している場合は、プロジェクト全体のJavaバージョンを確認することが不可欠です。古いバージョンで運用されているシステムに、安易にyield
を使ったコードを追加すると、ビルドエラーの原因となります。
また、yield
という単語は、Java 13までは変数名として利用できましたが、Java 14以降では予約語(キーワード)となったため、変数名として使えなくなりました。古いコードを新しいバージョンに移行する際は、この点にも注意が必要です。
まとめ — yieldを正しく理解して効率的に使おう
今回は、Java 14から導入されたキーワードyield
について、その基本的な役割から具体的な使い方、注意点までを詳しく解説しました。
最後に、この記事の要点をまとめます。
yield
は、switch
式の中から値を返すためのキーワードです。- 従来の
switch
文が抱えていたbreak
の書き忘れやコードの冗長性といった問題を解決します。 return
がメソッド全体を終了させるのに対し、yield
はswitch
式の結果を返すだけで、メソッドの処理は続行されます。yield
は値を返さないswitch
「文」では使えず、switch
「式」の中でのみ利用可能です。
yield
を適切に使いこなすことで、あなたのJavaコードはより安全で、簡潔かつ可読性の高いものへと進化します。