Java | 早期 return のベストパターン集

Java Java
スポンサーリンク

「早期 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. 正常なら最後まで実行             │
│ → ネストが浅く、意図が明確          │
└────────────────────┘

Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました