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

Java Java
スポンサーリンク

では「練習問題1:季節判定」を 戦略パターンでリファクタリングした解答例と解説を示します。


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

switch (month) {
    case 3:
    case 4:
    case 5:
        System.out.println("春");
        break;
    case 6:
    case 7:
    case 8:
        System.out.println("夏");
        break;
    case 9:
    case 10:
    case 11:
        System.out.println("秋");
        break;
    case 12:
    case 1:
    case 2:
        System.out.println("冬");
        break;
    default:
        System.out.println("不正な月です");
}
Java

👉 複数の月をまとめるためにフォールスルーを使っています。


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

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

interface SeasonStrategy {
    void printSeason();
}
Java

2. 具体的な戦略クラス

class SpringStrategy implements SeasonStrategy {
    public void printSeason() {
        System.out.println("春");
    }
}

class SummerStrategy implements SeasonStrategy {
    public void printSeason() {
        System.out.println("夏");
    }
}

class AutumnStrategy implements SeasonStrategy {
    public void printSeason() {
        System.out.println("秋");
    }
}

class WinterStrategy implements SeasonStrategy {
    public void printSeason() {
        System.out.println("冬");
    }
}
Java

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

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

class SeasonContext {
    private static final Map<Integer, SeasonStrategy> strategies = new HashMap<>();

    static {
        // 春
        strategies.put(3, new SpringStrategy());
        strategies.put(4, new SpringStrategy());
        strategies.put(5, new SpringStrategy());

        // 夏
        strategies.put(6, new SummerStrategy());
        strategies.put(7, new SummerStrategy());
        strategies.put(8, new SummerStrategy());

        // 秋
        strategies.put(9, new AutumnStrategy());
        strategies.put(10, new AutumnStrategy());
        strategies.put(11, new AutumnStrategy());

        // 冬
        strategies.put(12, new WinterStrategy());
        strategies.put(1, new WinterStrategy());
        strategies.put(2, new WinterStrategy());
    }

    public static void execute(int month) {
        SeasonStrategy strategy = strategies.get(month);
        if (strategy != null) {
            strategy.printSeason();
        } else {
            throw new IllegalArgumentException("不正な月です: " + month);
        }
    }
}
Java

4. 利用側

public class Main {
    public static void main(String[] args) {
        SeasonContext.execute(4);  // 春
        SeasonContext.execute(8);  // 夏
        SeasonContext.execute(11); // 秋
        SeasonContext.execute(1);  // 冬
    }
}
Java

解説

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

まとめ

  • フォールスルーを使わずに「複数条件をまとめる」には、戦略パターン+Map登録が有効。
  • 季節判定のような「分類処理」に適している。
  • 実務では「ステータス管理」「エラーレベル分類」などでも同じ手法が使える。
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました