Javaのyieldは、switch式のブロック内から値を返すためのキーワードです(Java 14で正式導入)。1行で値が決まるcaseはアロー構文だけで書け、処理を挟む{}ブロックやコロン構文でだけyieldが必要になります。
breakを書き忘れて次のcaseに処理が突き抜けた経験はないでしょうか。yieldを使うswitch式なら、この書き忘れが構造的に起きません。
私もJava 14(2020年)でyieldが導入された当初は、従来のswitch文との違いに少し戸惑いました。仕組みを理解してからは、コードの可読性が劇的に向上しています。
この記事でわかること
yieldがswitch式のどのcaseで必須になるのかyieldとreturnのスコープの違い- アロー構文だけで済ませてよい場面と
yieldが必要な場面の見分け方
PARTS LIST /目次
Javaのyieldとは?
Javaのyieldは、switch式の中から値を返すために使われるキーワードです。switch式はJava 12でプレビュー機能として登場しました。当初はbreak 値;で値を返す構文でしたが、Java 13の2回目のプレビューでyieldキーワードに変わり、Java 14(2020年3月)で正式な機能となりました。導入から6年が経過した2026年現在、業務コードでも標準的に使われています。正式な仕様はJEP 361: Switch Expressionsで定義されています。
言い換えると、switch式が結果を確定させるための「出口」をyieldが担っている、というイメージです。
従来のswitchは「文(Statement)」であり、処理を実行するだけでした。
しかし、新しいswitch「式(Expression)」は、処理の結果として値を生成できます。
yieldは、switch式の値を「産出する」または「提供する」という役割を担います。
yieldにより、breakの書き忘れによるフォールスルーバグが構造的に起きないコードを書けるようになりました。
yieldとThread.yield()の違い
「yield java」で検索すると、たまにThread.yield()の話と混同されます。Thread.yield()はJava 1.0から存在する、現在のスレッドの実行を一時的に譲るスケジューリングのヒントメソッドです。本記事で解説するswitch式のyieldキーワードとは、綴りが同じだけの全くの別機能なので注意してください。本記事が扱うのは、Java 14で導入されたswitch式専用のyieldキーワードです。
他言語yieldとの相違点
Pythonのyield(ジェネレータ関数の中で値を1つずつ遅延生成する仕組み)やC#のyield return(イテレータブロックで値を逐次生成する仕組み)をご存知の方は多いでしょう。これらを知っていると、Javaのyieldもそれらと同じ「繰延実行」の機能だと誤解しがちです。
しかし、Javaのyieldはあくまでswitch式が1回だけ値を返すための構文にすぎません。PythonやC#のように、メソッドの実行を中断・再開してジェネレータ的に値を生成し続ける機能は持たないのです。
他言語からJavaに移行してきた開発者ほど、この「名前は同じでも仕組みが違う」点を誤解しやすいポイントなので、注意しておきましょう。
yieldが導入された背景
なぜyieldとswitch式が導入されたのか。その答えは、従来のswitch文が抱えていた2つの課題にあります。
従来のswitch文には、主に2つの課題がありました。
- breakの書き忘れによるバグ
caseごとにbreakを書き忘れると、処理が次のcaseに突き抜けてしまいます。この現象は「フォールスルー(処理が次のcaseに流れ落ちてしまう現象)」と呼ばれ、意図しないバグの温床として多くの開発者を悩ませてきました。 - コードがムダに長くなる問題
switch文の結果を外部の変数に代入する場合、まず変数を宣言し、各caseで代入処理を書く必要がありました。変数宣言と代入が分離するため、コードが長くなり、可読性が低下する傾向があったのです。
2つの課題を解決し、より安全で表現力豊かなコードを書けるようにするために、switch式とyieldが導入されました。
switch式では、すべてのcaseを網羅するよう強制されるため、バグが入り込む余地が減ります。
yieldとreturnの違い
yieldとreturnは、どちらも値を返すキーワードですが、役割の範囲がまったく異なります。
return: メソッド全体の処理を終了し、値を呼び出し元に返します。returnが実行された時点で、そのメソッドは完全に終了yield:switch式の中から値を返すだけで、メソッドの処理は終了しません。switch式の評価が完了した後も、メソッド内の後続の処理は続行される
つまり、スコープが違うと覚えておきましょう。returnはメソッド全体、yieldは自身が含まれるswitch式だけが対象です。
yield・return・breakの違い早見表
3つのキーワードの違いを表で整理すると、役割の範囲が一目でわかります。
迷ったら「switch式で値を返したいならyield、メソッドごと終了するならreturn、switch文やループを抜けるだけならbreak」と覚えましょう。
switch式でyieldはどう使う?
結論として、yieldは波括弧{}ブロック内で使い、1行で済むcaseではアロー構文だけで済ませます。
yieldはswitch式の中で、特定のcaseが返す値を指定するために使用します。複数行の処理を書くときは波括弧{}のブロックの中に処理を書き、最後にyieldで値を返します。
switch式とyieldの組み合わせ例
yieldは、caseの処理が複数行にわたる場合に使われるのが一般的です。以下のコード例はJava 14以降で動作します。
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行で済む場合は、アロー->を使ってより簡潔に書けます。
String message = switch (day) {System.out.println(message);String message = switch (day) {System.out.println("休日が…");System.out.println(message);従来の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を使うことで、より安全で読みやすいコードを実現できるのです。
実務では、既存コードベースがJava 14以降であれば、新規コードはswitch式を優先的に使うことをおすすめします。
特にenumを返す処理やステータスコードの分岐では、switch式の網羅性チェックがコンパイル時にバグを防いでくれます。
ただし、チーム内でswitch式に馴染みがないメンバーがいる場合は注意が必要です。
コードレビューで混乱を招かないよう、使い方のガイドラインを事前に合意しておくとよいでしょう。
HTTPステータス判定での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式の結果として返せます。
処理と値の返却を1つのcaseブロックにまとめられる点が便利です。
enum追加漏れをswitch式が防ぐ
実務では、注文ステータスや承認フローのように、独自定義したenumに新しい値を後から追加する場面がよくあります。
たとえば注文ステータスにPROCESSING(処理中)を追加したとき、従来のswitch文だと対応するcaseの追加を忘れてもコンパイルは通ってしまいます。
その結果、defaultの分岐に静かに流れて、誤った挙動のまま本番に出てしまうことがあります。
switch式なら話が変わります。
defaultを書かずにenumの全パターンを列挙しておけば、網羅していない時点でコンパイルエラーになります。これにより、追加し忘れたcaseにその場で気づけます(defaultがあると漏れはエラーにならず、default側に流れます)。
「新しいステータスを追加したのに、どこかの分岐処理を直し忘れていた」という種類のバグは、switch式に置き換えるだけで構造的に起きなくなります。
実際に4つの値を持つenumで1つだけcaseを書き忘れてコンパイルしてみると(OpenJDK 23.0.1で確認)、error: the switch expression does not cover all possible input valuesというエラーで止まります。defaultで握りつぶされず、追加し忘れがその場でビルドエラーとして表面化する一次情報です。
パターンマッチングとyield
Java 21で正式化されたパターンマッチングswitchは、型による分岐とyieldを組み合わせることで、より宣言的なコードを書けます。
Object obj = 42;
String result = switch (obj) {
case Integer i -> {
yield "整数: " + i;
}
case String s -> {
yield "文字列: " + s;
}
default -> "不明な型";
};
System.out.println(result); // 整数: 42
型ごとの分岐後に追加処理を挟みたい場合は、ブロック内でyieldを使います。1行で完結するならアロー構文のみで値を直接返しても構いません。
yieldを使うときに注意すべき点は?
yieldは便利な機能ですが、使い方を誤るとコンパイルエラーになります。以下の4つの注意点を押さえておきましょう。
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式が返す値を指定するためだけに存在します。
「yield outside」エラーの対処法
yieldをswitch式の外(switch文の中やメソッド直下など)で使うと、コンパイルエラーになります。
javacコンパイラは実際にyield outside of switch expressionというエラーを出します。
メモ
「switch expressionの外でyieldを使っている」という意味のエラーです。switch文の中やメソッド直下でyieldを書くと発生します。
このyield outside of switch expressionというエラーは、上で見た「これは値を返さない『文』なので、yieldは使えない」というコード例をコンパイルした際に出力される、実際のエラーメッセージです。
実際に上のコードをコンパイルすると(OpenJDK 23.0.1で確認)、次のように出力されます。
error: yield outside of switch expression
yield 1;
^
1 error
エラー箇所の行まで指し示してくれるので、switch文の中に紛れ込んだyieldを見つけるのは難しくありません。
対処法はシンプルで、yieldをswitch式のブロック内に移動するだけです。
switchそのものを「文」から「式」に書き換え、その結果を変数に代入するかreturnするように直せば、このエラーは解消します。
可読性の観点からの使い分け
switch式には、yieldを使う構文と、アロー->を使う構文の2種類があります。可読性の観点から使い分けましょう。
- アロー (->) を使うべきケース
caseの処理が1行で終わるなら、アローが簡潔です。
例:case MONDAY -> "平日"; - yield を使うべきケース
値を返す前にログ出力などの処理が必要なとき、波括弧{}ブロック内でyieldを使います。具体的な書き方は前述の「HTTPステータス判定でのyield」のコード例を参考にしてください。
処理内容に応じて適切な構文を選べば、コードの意図が伝わりやすくなります。
「yieldを書くべきか」の判断手順を図にすると、次のようになります。
case X -> 値case X -> { 処理 … yield 値 }case X:case X: yield 値なお、switch式はコロン構文(case MONDAY: yield "平日";)でも書けますが、この場合は各caseでyieldが必須で、case MONDAY: "平日";のように値だけを書くと「文ではありません」というコンパイルエラーになります。フォールスルーも残るため、新しく書くコードではアロー構文を基本にしましょう。
HTTPステータス判定以外にも、ユーザー権限ロールに応じた処理分岐など、値を判定した後に追加処理が必要な場面全般でyieldが有効です。

私の経験上、yieldが必要になるケースは全体の2〜3割程度です。ほとんどのcaseは1行で済むため、アロー構文で十分です。
ログ出力やバリデーションなど副作用を伴う処理がある場合にだけyieldを使う、という運用が実務ではうまく機能しています。
バージョン互換性の注意
yieldはJava 14で正式に導入された機能です。
つまり、境界線は明確です。
2026年時点の最新LTSはJava 25(2025年9月リリース)です。yieldはJava 21はもちろんJava 25、さらに2026年9月にリリースされたJava 27でも問題なく利用できます。
プロジェクトで使っているJavaのバージョンが13以前なら、yieldおよびswitch式は使えません。
チームで開発している場合は、プロジェクト全体のJavaバージョンを確認してください。
古いバージョンで運用されているシステムに、安易にyieldを使ったコードを追加すると、ビルドエラーの原因となります。
制限付きキーワードの位置づけ
yieldという単語は、Java 14以降switch式の中では特別な意味を持つ「制限付きキーワード(contextual keyword)」として扱われます。
classやifのような完全な予約語とは異なり、switch式の外側であればyieldを引き続き変数名として使えます(メソッド名にもできますが、呼び出すときは修飾が必要です)。
既存コードのyieldという名前の変数は、Java 14以降もそのままコンパイルできます。一方、yieldという名前のメソッドを修飾なしで呼び出している箇所(yield(1);)は、error: invalid use of a restricted identifier 'yield'というコンパイルエラーになります(OpenJDK 23.0.1で確認。to invoke a method called yield, qualify the yield with a receiver or type nameという補足も表示されます)。クラス名やthisで修飾して呼び出す(MyClass.yield(1);)か、混乱を避けるため命名を見直してください。
実際にそうした命名に出会ったとき、少し身構えるかもしれません。
なお、switch式のパターンマッチングはJava 17でプレビュー機能として初登場しました。
Java 21で正式機能になり、本記事のサンプルもJava 21以降を想定しています。
yieldを理解しておくことが、パターンマッチングなどの新機能を活用するための土台です。
yieldに関するよくある質問
yieldについて、読者からよく聞かれる質問をまとめました。意味やreturnとの使い分け、バージョン対応まで本文で解説した内容を中心にまとめています。細かい条件や根拠は、各見出しの本文もあわせて確認してください。
Q1. yieldはどういう意味?
A1. 「産出する」「もたらす」という意味の英単語です。Javaのswitch式では、caseブロックの処理結果を式全体の値として「産出する」役割を担うキーワードとして使われています。
Q2. yieldでnullを返すことはできる?
A2. できます。yield null;と書けば、switch式の結果としてnullを返せます。ただし呼び出し側でNullPointerExceptionが起きないよう、null許容であることを明示するコメントや型注釈を添えることを推奨します。
Q3. yieldとreturn、どちらを使うべき?
A3. switch式の中だけで値を確定させたいならyield、メソッド自体を終了して値を返したいならreturnを使います。switch式をメソッドの戻り値としてそのまま使う場合は、switch式の外側でreturnし、内側の各caseではyieldを使うのが基本形です。
Q4. yieldの代わりになる書き方はある?
A4. caseの処理が1行で完結するなら、アロー構文(case X -> 値;)でyieldを省略できます。複数行の処理が必要な場合のみ、波括弧のブロック内でyieldが必須になります。
Q5. yieldはいつから使える?
A5. Java 13でプレビュー機能として導入され、Java 14(2020年3月リリース)で正式機能になりました。2026年時点の最新LTSはJava 25(2025年9月リリース)、最新の一般リリースは2026年9月リリースのJava 27です。いずれもJava 14以降のバージョンなので、問題なく使用できます。
Q6. 他言語yieldとは異なる?
A6. 違います。Pythonのyieldはジェネレータ、C#のyield returnはイテレータブロックで、それぞれ値を逐次生成する機能です。一方、Javaのyieldはswitch式が1回だけ値を返すための構文にすぎず、繰延実行の機能は持ちません。
まとめ:yieldを正しく理解して効率的に使おう
yieldの要点を振り返ります。
yieldは、switch式の中から値を返すためのキーワードです。- 従来の
switch文が抱えていたbreakの書き忘れやコードのムダの多さといった問題を解決します。 returnがメソッド全体を終了させるのに対し、yieldはswitch式の結果を返すだけで、メソッドの処理は続行されます。yieldは値を返さないswitch「文」では使えず、switch「式」の中でのみ利用可能です。
yieldを適切に使いこなすことで、Javaコードはより安全で、簡潔かつ可読性の高いものへと進化します。
| REV. | DATE | 内容 |
|---|---|---|
| 7 | 2026-11-04 | yieldのコンパイルエラー文言を実際の出力に修正し、実行確認済みのコード例・内部リンクを追加 |
| 6 | 2026-10-15 | 図解を描き直し(図面のデザインにそろえた) |
| 5 | 2026-10-14 | 雰囲気だけの挿絵を外した |
| 4 | 2026-09-10 | 2026年9月時点の情報で全体を見直し(古い記述を3件更新) |
| … ほか2回の改訂 | ||
| 1 | 2025-09-28 | 初版 |








