Java | switch文を戦略パターンにリファクタリングする練習問題」

Java Java
スポンサーリンク

では「Map+ラムダ式(Java 8以降)」を使った軽量なリファクタ例を紹介します。これは switch文を使わずに、条件ごとの処理を関数としてMapに登録する方法です。


例:注文ステータス管理(Map+ラムダ)

元のコード(switch)

switch (status) {
    case "NEW":
        System.out.println("新規注文を登録しました");
        break;
    case "PROCESSING":
        System.out.println("注文を処理中です");
        break;
    case "SHIPPED":
        System.out.println("注文を発送しました");
        break;
    case "CANCELLED":
        System.out.println("注文をキャンセルしました");
        break;
    default:
        throw new IllegalArgumentException("不明なステータス: " + status);
}
Java

リファクタ後(Map+ラムダ)

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

public class OrderStatusHandler {
    private static final Map<String, Runnable> handlers = new HashMap<>();

    static {
        handlers.put("NEW", () -> System.out.println("新規注文を登録しました"));
        handlers.put("PROCESSING", () -> System.out.println("注文を処理中です"));
        handlers.put("SHIPPED", () -> System.out.println("注文を発送しました"));
        handlers.put("CANCELLED", () -> System.out.println("注文をキャンセルしました"));
    }

    public static void execute(String status) {
        Runnable handler = handlers.getOrDefault(status,
            () -> { throw new IllegalArgumentException("不明なステータス: " + status); });
        handler.run();
    }

    public static void main(String[] args) {
        execute("NEW");       // 新規注文を登録しました
        execute("SHIPPED");   // 注文を発送しました
        execute("UNKNOWN");   // IllegalArgumentException
    }
}
Java

解説

  • switch不要:Mapに「キー(ステータス)」と「処理(ラムダ式)」を登録。
  • getOrDefault:未知のキーが来た場合に例外を投げる処理をデフォルトで設定。
  • 拡張性:新しいステータスを追加する場合はMapに1行追加するだけ。
  • シンプル:戦略パターンほどクラス分割しなくても済むので軽量。

まとめ

  • 戦略パターン → クラス分割で責務を明確化。大規模・複雑な処理に向いている。
  • enum+戦略 → 型安全で拡張性が高い。状態管理に最適。
  • Map+ラムダ → 軽量でシンプル。小規模な分岐処理に最適。
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました