Java | 実務で使う switch 文テンプレート集

Java Java
スポンサーリンク

ここでは「実務で使う switch 文のテンプレート集(例外・ログ対応つき)」を、
業務アプリ開発でそのまま使える構成でまとめます。


ンプレート1:基本構造+ログ+デフォルト例外

「switchの基本形」にログ出力デフォルトハンドリングを加えた安全設計版。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SwitchBasicTemplate {
    private static final Logger log = LoggerFactory.getLogger(SwitchBasicTemplate.class);

    public static void main(String[] args) {
        int command = 2; // 例:外部入力値

        try {
            switch (command) {
                case 1:
                    log.info("処理1を開始");
                    executeProcess1();
                    break;
                case 2:
                    log.info("処理2を開始");
                    executeProcess2();
                    break;
                case 3:
                    log.info("処理3を開始");
                    executeProcess3();
                    break;
                default:
                    log.warn("未知のコマンド: {}", command);
                    throw new IllegalArgumentException("不正なコマンドです: " + command);
            }
        } catch (Exception e) {
            log.error("処理中にエラーが発生しました: {}", e.getMessage(), e);
        }
    }

    private static void executeProcess1() {
        log.debug("詳細処理1実行中...");
    }

    private static void executeProcess2() {
        log.debug("詳細処理2実行中...");
    }

    private static void executeProcess3() {
        log.debug("詳細処理3実行中...");
    }
}
Java

ポイント

  • log.info():業務フローの進行を記録
  • log.warn():不正入力など軽度エラー
  • log.error():例外発生を詳細記録
  • IllegalArgumentException:想定外入力を明示的に排除

テンプレート2:enum+switch(保守性・拡張性UP)

実務では、定数値よりenumを使う方が安全で、可読性が高いです。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SwitchEnumTemplate {
    private static final Logger log = LoggerFactory.getLogger(SwitchEnumTemplate.class);

    public static void main(String[] args) {
        String input = "UPDATE"; // 例:ユーザー入力
        try {
            CommandType type = CommandType.valueOf(input.toUpperCase());
            switch (type) {
                case ADD:
                    log.info("データ登録処理を開始");
                    break;
                case UPDATE:
                    log.info("データ更新処理を開始");
                    break;
                case DELETE:
                    log.info("データ削除処理を開始");
                    break;
                default:
                    log.warn("未定義のコマンド: {}", input);
            }
        } catch (IllegalArgumentException e) {
            log.error("コマンド解析エラー: {}", input);
        } catch (Exception e) {
            log.error("予期せぬエラー: {}", e.getMessage(), e);
        }
    }

    enum CommandType {
        ADD, UPDATE, DELETE
    }
}
Java

ポイント

  • enum により誤入力をコンパイル時に検知できる
  • valueOf() の例外をキャッチして安全化

テンプレート3:switch+return早期終了(早期リターン構文)

実務では「ネストを減らす」ため、switchの中で早期returnするのが定石。

public class SwitchEarlyReturn {
    public static void main(String[] args) {
        String command = "DELETE";

        handleCommand(command);
        System.out.println("=== 正常終了 ===");
    }

    private static void handleCommand(String command) {
        switch (command) {
            case "ADD":
                System.out.println("登録処理");
                return;
            case "UPDATE":
                System.out.println("更新処理");
                return;
            case "DELETE":
                System.out.println("削除処理");
                return;
            default:
                System.err.println("不明なコマンド");
                return;
        }
    }
}
Java

メリット

  • ネストせずスッキリ書ける
  • 「1ケース1出口」構造でログ管理しやすい

テンプレート4:switch内で例外スロー(上位ハンドリング)

「上位で統一ログ管理」する方針のときは、switch内では例外だけ投げる

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SwitchThrowTemplate {
    private static final Logger log = LoggerFactory.getLogger(SwitchThrowTemplate.class);

    public static void main(String[] args) {
        try {
            processCommand(5);
        } catch (Exception e) {
            log.error("業務処理エラー: {}", e.getMessage(), e);
        }
    }

    private static void processCommand(int command) throws Exception {
        switch (command) {
            case 1:
                log.info("登録処理");
                break;
            case 2:
                log.info("更新処理");
                break;
            default:
                throw new UnsupportedOperationException("未対応コマンド: " + command);
        }
    }
}
Java

実務パターン

  • ビジネス層では例外を投げる
  • コントローラ層やジョブ層で共通ログ出力&例外変換

テンプレート5:文字列switch+共通ロガー呼び出し

Webアプリのリクエストなど、文字列を分岐キーにするケース。

public class SwitchStringTemplate {
    private static final java.util.logging.Logger log =
        java.util.logging.Logger.getLogger(SwitchStringTemplate.class.getName());

    public static void main(String[] args) {
        String action = "export";

        switch (action.toLowerCase()) {
            case "import":
                log.info("インポート処理を開始");
                break;
            case "export":
                log.info("エクスポート処理を開始");
                break;
            case "sync":
                log.info("データ同期処理を開始");
                break;
            default:
                log.warning("未知のアクション: " + action);
        }
    }
}
Java

実務ヒント

  • toLowerCase()trim()で安全な比較
  • ロガーを共通化して全社共通ログ設計に統一できる

まとめ表

パターン主な用途特徴
基本+例外ログ単発処理安全で堅牢
enum版拡張しやすい業務コマンド型安全で保守性◎
早期return版処理分岐を簡潔化ネスト削減
例外スロー版上位で共通ログ化責務分離
文字列版Web/CLI入力処理柔軟だが事前整形が必要

もし希望があれば、次のような「応用テンプレート集」も作成できます👇

  • ✅ Spring Boot 向け「switch+@Service分岐+共通例外設計」
  • ✅ Stream API・Mapでのswitch代替(マップディスパッチ方式)
  • ✅ switch式(Java 14+)を使った関数的スタイル書き換え版

どれを次に見たいですか?

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