「早期 return のベストパターン集(実務例5選)」は、
**「ネストを浅くして読みやすく、安全にする」**ための超重要テクニックです。
初心者でも実務で即使えるように、
👀 図解(ASCII)+ 💻 コード例+ 💡ポイント解説
の教材スタイルでまとめます。
パターン1:入力チェック(null・空文字)
考え方
入力不備を早めに検知して抜けることで、
後続処理の NullPointerException などを防止。
[安全設計フロー]
┌──[入力チェック]──┐
│ ダメならreturn │ ← ここで抜ける
└──[本処理に進む]──┘
💻 コード例
public void processUser(User user) {
if (user == null) {
log.warn("Userがnullのためスキップ");
return; // 早期リターンで安全
}
// 本処理(安全にアクセス可能)
System.out.println("User名:" + user.getName());
}
Java💡ポイント
- 「正常ルート」だけを最後に残す設計が読みやすい
- 「異常チェック」は最初に全部書いて return
パターン2:権限チェック・認可処理
考え方
認可に失敗した時点で抜けて無駄な処理をしない。
┌─[権限確認]────┐
│ NGならreturn │
└─[本処理へ]────┘
💻 コード例
public void deleteData(User user) {
if (!user.hasRole("ADMIN")) {
log.warn("権限なしユーザー:" + user.getName());
return; // 不正操作防止
}
dataRepository.deleteAll();
log.info("削除完了");
}
Java💡ポイント
- 不正操作や誤操作の防止に有効
- 認可チェックは早めに切り上げる(Fail Fast)
パターン3:条件不成立(業務ロジック)
考え方
「対象がなければ何もしない」で早期に抜ける。
┌──[対象あり?]─────┐
│ ない→return │
└──[処理続行]──────┘
💻 コード例
public void sendMail(List<User> users) {
if (users == null || users.isEmpty()) {
log.info("送信対象なし");
return;
}
for (User u : users) {
mailService.send(u);
}
}
Java💡ポイント
- 「何もしない」ことも明確に設計意図として書く
- 無駄なループや外部呼び出しを防止
パターン4:複雑な条件分岐の整理(ネスト削減)
考え方
ネスト地獄(if の入れ子)を回避する王道テクニック。
NG例:
if (a) {
if (b) {
if (c) { 処理 }
}
}
OK例(早期return):
if (!a) return;
if (!b) return;
if (!c) return;
処理;
Java💻 コード例
public void process(Order order) {
if (order == null) return;
if (!order.isValid()) return;
if (order.isCanceled()) return;
// ここまで来たら必ず安全
ship(order);
}
Java💡ポイント
- 「守衛節(Guard Clause)」と呼ばれる書き方
- 「問題があれば即抜ける」ことで可読性UP
パターン5:テストやリトライループの中断
考え方
条件を満たしたらすぐに抜けて、
無駄なループを回さない。
┌───[forループ]─────────┐
│ 条件達成 → return │ ← 早期終了
│ 未達 → 続行 │
└──────────────────┘
💻 コード例
public void waitUntilReady() {
for (int i = 0; i < 5; i++) {
if (isSystemReady()) {
log.info("システム起動OK");
return; // 成功 → 抜ける
}
sleep(1000);
}
log.error("起動失敗");
}
Java💡ポイント
- 成功条件を満たした時点で抜けるのが自然
breakよりも「処理ごと抜ける」ならreturn
まとめ:早期returnの判断基準
| 状況 | 対応 | 理由 |
|---|---|---|
| 想定内の無効条件(null、空など) | ✅ return | 想定内の分岐。安全で簡潔。 |
| 想定外・異常(例外) | ❌ throw | 呼び出し元で処理する必要あり。 |
| 成功条件を満たした時点で終了 | ✅ return | 処理を最短で終える。 |
| ネストが深くなりそう | ✅ Guard Clause | 読みやすく保守性が高い。 |
補足:安全設計の原則「Guard Clause パターン」
┌────────────────────┐
│ Guard Clause = 先に抜ける │
│ 1. 不正ならreturn │
│ 2. 正常なら最後まで実行 │
│ → ネストが浅く、意図が明確 │
└────────────────────┘


