Java | フォールスルーを使わないで同じ挙動を実現するリファクタ例

Java Java
スポンサーリンク

意図的フォールスルー」は、簡単な条件まとめには便利ですが、規模が大きくなると可読性が下がるため、デザインパターン(特に戦略パターン)などを使って置き換えることが実務的にはよくあります。


フォールスルーを使った例(元コード)

switch (userType) {
    case "ADMIN":
        // 管理者と一般ユーザーの共通処理
        logAccess(userType);
        // ↓意図的フォールスルー
    case "USER":
        showMenu();
        break;
    case "GUEST":
        showGuestMenu();
        break;
    default:
        throw new IllegalArgumentException("不明なユーザー種別です");
}
Java

🔍 問題点

  • "ADMIN""USER"処理が落ちる(フォールスルー)ため、
    意図を知らない人が読むとバグに見える。
  • 条件が増えると、どこからどこへ落ちていくかが複雑になる。

フォールスルーを使わずに同じ挙動を実現(リファクタ例)

パターン1:共通処理メソッドを呼び出す

switch (userType) {
    case "ADMIN":
        logAccess(userType);
        showMenu();
        break;
    case "USER":
        showMenu();
        break;
    case "GUEST":
        showGuestMenu();
        break;
    default:
        throw new IllegalArgumentException("不明なユーザー種別です");
}
Java

→ シンプルで、処理の流れが明確
共通処理が増えたら、共通メソッド化するだけで済みます。


🧠 パターン2:戦略パターン(Strategy Pattern)で整理

実務的にはこちらがよく使われます。
「ユーザーの種類ごとに異なる処理」をクラスに分けることで、
switch文自体をなくすことができます。


コード例:

interface UserStrategy {
    void execute();
}

class AdminUser implements UserStrategy {
    public void execute() {
        logAccess();
        showMenu();
    }
    private void logAccess() { System.out.println("管理者アクセスログ"); }
    private void showMenu() { System.out.println("管理者メニュー表示"); }
}

class NormalUser implements UserStrategy {
    public void execute() {
        showMenu();
    }
    private void showMenu() { System.out.println("ユーザーメニュー表示"); }
}

class GuestUser implements UserStrategy {
    public void execute() {
        showGuestMenu();
    }
    private void showGuestMenu() { System.out.println("ゲストメニュー表示"); }
}

class UserFactory {
    static UserStrategy getStrategy(String userType) {
        switch (userType) {
            case "ADMIN": return new AdminUser();
            case "USER":  return new NormalUser();
            case "GUEST": return new GuestUser();
            default: throw new IllegalArgumentException("不明なユーザー種別");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        String userType = "ADMIN";
        UserStrategy strategy = UserFactory.getStrategy(userType);
        strategy.execute();
    }
}
Java

メリット

観点戦略パターンの利点
可読性switchやフォールスルーが消える
拡張性新しいユーザー種別をクラス追加で対応
テスト各戦略クラスを単体テスト可能
バグ防止フォールスルーによる意図しない動作を排除

まとめ

方法特徴適用範囲
フォールスルー短い処理で複数条件まとめたい時小規模コード
共通メソッド呼び出し可読性と意図の明確化中規模コード
戦略パターン拡張性と保守性を重視大規模・業務システム
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました