Javaのswitch文で複数条件を効率よく扱う

switch文は、式の値に基づいて処理を分岐させるJavaの制御構文です。同じ処理を行う条件が複数ある場合は、caseラベルを連続して記述しbreakを共有することで、重複したコードを削減できます。

基本的な構文

switch (式) {
    case 値1:
        // 処理
        break;
    case 値2:
        // 処理
        break;
    default:
        // どのcaseにも一致しない場合の処理
}
  • intStringenumなど、評価対象となる値。
  • case 値:式と一致した場合に実行されるラベル。
  • breakswitch文を終了し、後続のcaseへの流れ(fall-through)を防ぐ。
  • default:一致しない場合のデフォルト処理。

複数のcaseをまとめる

異なる値に対して同じ処理を行いたい場合、breakを共用しないでcaseを並べます。

char rank = 'B';

switch (rank) {
    case 'A':
    case 'B':
    case 'C':
        System.out.println("合格");
        break;
    case 'D':
    case 'E':
        System.out.println("不合格");
        break;
    default:
        System.out.println("未対応の評価");
}

上記では、A / B / Cは同じ合格メッセージを出力します。

Stringを使った複数条件

Java 7以降では、Stringswitchの判定対象にできます。

String role = "manager";

switch (role) {
    case "admin":
    case "manager":
        System.out.println("管理機能を利用できます");
        break;
    case "user":
    case "guest":
        System.out.println("一般機能を利用できます");
        break;
    default:
        System.out.println("権限が不明です");
}

enumを利用した分岐

列挙型を使うと、値の集合が明確になり、タイプミスを防げます。

public enum Priority {
    LOW, MIDDLE, HIGH, CRITICAL
}
Priority current = Priority.MIDDLE;

switch (current) {
    case LOW:
    case MIDDLE:
        System.out.println("通常対応");
        break;
    case HIGH:
    case CRITICAL:
        System.out.println("緊急対応");
        break;
}

定数を組み合わせた例

固定値を定数として定義し、switch文で利用できます。

public class StatusCode {
    public static final int OK = 200;
    public static final int CREATED = 201;
    public static final int BAD_REQUEST = 400;
    public static final int UNAUTHORIZED = 401;
    public static final int NOT_FOUND = 404;
    public static final int ERROR = 500;
}
int status = StatusCode.BAD_REQUEST;

switch (status) {
    case StatusCode.OK:
    case StatusCode.CREATED:
        System.out.println("成功");
        break;
    case StatusCode.BAD_REQUEST:
    case StatusCode.UNAUTHORIZED:
    case StatusCode.NOT_FOUND:
        System.out.println("クライアントエラー");
        break;
    case StatusCode.ERROR:
        System.out.println("サーバーエラー");
        break;
    default:
        System.out.println("不明なステータス");
}

入れ子のswitch文

条件が二段階必要な場合、switch文を入れ子にできます。

String userType = "admin";
String operation = "delete";

switch (userType) {
    case "admin":
        switch (operation) {
            case "create":
                System.out.println("管理者がコンテンツを作成");
                break;
            case "delete":
                System.out.println("管理者がコンテンを削除");
                break;
            default:
                System.out.println("不正な操作");
        }
        break;
    case "user":
        switch (operation) {
            case "create":
                System.out.println("ユーザーがコンテンツを作成");
                break;
            case "delete":
                System.out.println("削除権限がありません");
                break;
            default:
                System.out.println("不正な操作");
        }
        break;
    default:
        System.out.println("不明なユーザー種別");
}

処理をメソッドに切り出す

同じcaseブロックが長くなる場合、個別のメソッドに切り出すと可読性が向上します。

public class SwitchGroupedCases {

    public static void main(String[] args) {
        char rank = 'B';
        showResult(rank);
    }

    public static void showResult(char rank) {
        switch (rank) {
            case 'A':
            case 'B':
            case 'C':
                printPassed();
                break;
            case 'D':
            case 'E':
                printFailed();
                break;
            default:
                printUnknown();
        }
    }

    private static void printPassed() {
        System.out.println("合格");
    }

    private static void printFailed() {
        System.out.println("不合格");
    }

    private static void printUnknown() {
        System.out.println("未対応の評価");
    }
}

タグ: Java switch文 Enum 定数 入れ子制御

8月13日 14:45 投稿