switch文は、式の値に基づいて処理を分岐させるJavaの制御構文です。同じ処理を行う条件が複数ある場合は、caseラベルを連続して記述しbreakを共有することで、重複したコードを削減できます。
基本的な構文
switch (式) {
case 値1:
// 処理
break;
case 値2:
// 処理
break;
default:
// どのcaseにも一致しない場合の処理
}
- 式:
int、String、enumなど、評価対象となる値。 - case 値:式と一致した場合に実行されるラベル。
- break:
switch文を終了し、後続の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以降では、Stringもswitchの判定対象にできます。
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("未対応の評価");
}
}