Java | フォールスルーのある switch を戦略パターンで安全に置き換える 練習問題

Java Java
スポンサーリンク

では「練習問題3:ユーザー権限判定」を 戦略パターンでリファクタリングした解答例を示します。


元のコード(フォールスルーあり)

switch (role) {
    case "ADMIN":
    case "SUPERUSER":
        System.out.println("全権限を付与");
        break;
    case "USER":
    case "GUEST":
        System.out.println("制限付き権限を付与");
        break;
    default:
        System.out.println("不明な権限");
}
Java

👉 「ADMIN」「SUPERUSER」をまとめて全権限、「USER」「GUEST」をまとめて制限付き権限にするためにフォールスルーを使っています。


戦略パターンによるリファクタ解答

1. 戦略インターフェース

interface RoleStrategy {
    void assignPermissions();
}
Java

2. 具体的な戦略クラス

class FullPermissionStrategy implements RoleStrategy {
    public void assignPermissions() {
        System.out.println("全権限を付与");
    }
}

class LimitedPermissionStrategy implements RoleStrategy {
    public void assignPermissions() {
        System.out.println("制限付き権限を付与");
    }
}

class UnknownPermissionStrategy implements RoleStrategy {
    public void assignPermissions() {
        System.out.println("不明な権限");
    }
}
Java

3. コンテキスト(戦略選択)

import java.util.HashMap;
import java.util.Map;

class RoleContext {
    private static final Map<String, RoleStrategy> strategies = new HashMap<>();

    static {
        // 全権限グループ
        strategies.put("ADMIN", new FullPermissionStrategy());
        strategies.put("SUPERUSER", new FullPermissionStrategy());

        // 制限付き権限グループ
        strategies.put("USER", new LimitedPermissionStrategy());
        strategies.put("GUEST", new LimitedPermissionStrategy());
    }

    public static void execute(String role) {
        RoleStrategy strategy = strategies.getOrDefault(role, new UnknownPermissionStrategy());
        strategy.assignPermissions();
    }
}
Java

4. 利用側

public class Main {
    public static void main(String[] args) {
        RoleContext.execute("ADMIN");     // 全権限を付与
        RoleContext.execute("USER");      // 制限付き権限を付与
        RoleContext.execute("UNKNOWN");   // 不明な権限
    }
}
Java

解説

  • switchのフォールスルーを排除
    → Mapに「権限名」と「戦略クラス」を紐付けることで安全に分類。
  • メリット
    • フォールスルーの危険がなくなる。
    • 新しい権限を追加する場合はMapに登録するだけ。
    • 各戦略クラスを単体テスト可能。
  • デメリット
    • クラス数が増えるので小規模な処理には冗長。
    • ただし業務コードでは「責務分離」「拡張性」が重要なので有効。

まとめ

  • フォールスルーを使わずに「複数条件をまとめる」には、戦略パターン+Map登録が有効。
  • ユーザー権限判定のような「グループ化された条件分岐」に適している。
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました