ここでは「実務で使う 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+)を使った関数的スタイル書き換え版
どれを次に見たいですか?
