switch 文 / switch 式(Java)
条件分岐の構文です。『switch』文は1つの変数や式の値に応じて複数の処理を分岐させます。Java 14で正式化された『switch式』は ->(ラムダスタイル)を使って簡潔に値を返せます。従来の switch 文(case・break・default)との違い、文字列・列挙型(enum)でのswitchの使い方、yield キーワードによる値の返却まで解説します。
構文
// 従来のswitch文(Java 1.0〜)です
// caseの処理が終わったら必ずbreakを書かないと次のcaseに落ちてしまいます(フォールスルー)
switch (変数または式) {
case 値1:
// 値1と一致したときに実行されます
break; // breakがないと次のcaseに処理が続いてしまいます
case 値2:
// 値2と一致したときに実行されます
break;
default:
// どのcaseにも一致しないときに実行されます
break;
}
// switch式(Java 14〜)のラムダスタイルです
// -> の右側の処理が実行され、値を返します。breakは不要です。フォールスルーしません
String result = switch (変数または式) {
case 値1 -> "値1のとき";
case 値2 -> "値2のとき";
default -> "どれでもないとき";
};
// switch式でブロックを使う場合は yield で値を返します
String result2 = switch (変数または式) {
case 値1 -> {
// 複数行の処理ができます
System.out.println("値1のときの処理");
yield "値1の結果"; // yieldで値を返します(returnではありません)
}
default -> "デフォルト";
};
// 複数の値を1つのcaseにまとめられます(switch文・switch式どちらも対応)
switch (変数または式) {
case 値1, 値2, 値3:
// 値1・値2・値3のいずれかに一致したときに実行されます
break;
}
switch文とswitch式の比較
| 項目 | switch文(従来) | switch式(Java 14〜) |
|---|---|---|
| 構文スタイル | case 値: | case 値 -> |
| フォールスルー | breakを省略すると次のcaseに落ちます。 | フォールスルーしません。 |
| breakの必要性 | 必要(省略するとフォールスルー)。 | 不要です。 |
| 値の返却 | 値を返せません(文)。 | 値を返せます(式)。変数への代入も可能です。 |
| ブロック内の返却 | 該当なし。 | yield キーワードを使います。 |
| defaultの省略 | 省略可(省略するとどのcaseにも入らない)。 | 全パターンを網羅していない場合はコンパイルエラーになります。 |
サンプルコード
SwitchStatement.java
public class SwitchStatement {
public static void main(String[] args) {
// --- 従来のswitch文(int)---
// 術式等級(1〜特1)を数値で受け取り、呪術師の等級を表示します
int grade = 2;
System.out.println("=== switch文(従来)===");
switch (grade) {
case 1:
System.out.println("等級1: 伏黒恵など上位の呪術師です。");
break;
case 2:
System.out.println("等級2: 虎杖悠仁が仮入学時の等級です。"); // ここが実行されます
break;
case 3:
System.out.println("等級3: 一般的な呪術師の等級です。");
break;
case 4:
System.out.println("等級4: 呪術師としての始まりの等級です。");
break;
default:
System.out.println("特1等級または不明な等級です。");
break;
}
// --- フォールスルーの例 ---
// breakを省略すると次のcaseに処理が続きます。意図的に使うこともあります
// 等級1〜2を「上位等級」として同じ処理にまとめる例です
System.out.println("\n=== フォールスルーで複数caseをまとめる例 ===");
int rank = 1;
switch (rank) {
case 1:
case 2:
// case 1 の break がないため case 2 に落ちて、case 2 の処理が実行されます
System.out.println("上位等級の呪術師です。(等級: " + rank + ")");
break;
case 3:
case 4:
System.out.println("一般等級の呪術師です。(等級: " + rank + ")");
break;
default:
System.out.println("特1等級または未登録です。");
break;
}
// --- 文字列でのswitch文 ---
// Java 7以降、Stringをswitchの引数に使えます
String technique = "無量空処";
System.out.println("\n=== 文字列でのswitch文 ===");
switch (technique) {
case "無量空処":
System.out.println("五条悟の領域展開です。あらゆる情報を脳に流し込みます。");
break;
case "蒼":
case "赫":
System.out.println("五条悟の術式反転・術式順転です。");
break;
case "黒閃":
System.out.println("虎杖悠仁が使用する空間の歪みを伴う打撃術です。");
break;
default:
System.out.println("不明な術式です: " + technique);
break;
}
}
}
コンパイルして実行すると次のようになります。
javac SwitchStatement.java java SwitchStatement === switch文(従来)=== 等級2: 虎杖悠仁が仮入学時の等級です。 === フォールスルーで複数caseをまとめる例 === 上位等級の呪術師です。(等級: 1) === 文字列でのswitch文 === 五条悟の領域展開です。あらゆる情報を脳に流し込みます。
SwitchExpression.java
public class SwitchExpression {
public static void main(String[] args) {
// --- switch式(Java 14〜)のラムダスタイル ---
// -> を使うことで値を返すswitch式になります。breakは不要です
int grade = 2;
// switch式の結果を変数に代入できます
String gradeLabel = switch (grade) {
case 1 -> "等級1(伏黒恵レベル)";
case 2 -> "等級2(虎杖悠仁レベル)"; // ここが選択されます
case 3 -> "等級3";
case 4 -> "等級4";
default -> "特1等級または不明";
};
System.out.println("等級ラベル: " + gradeLabel);
// --- 複数の値を1つのcaseにまとめる書き方 ---
String technique = "赫";
String techniqueType = switch (technique) {
case "蒼", "赫", "紫" -> "五条悟の術式(順転・反転・虚式)";
case "無量空処" -> "五条悟の領域展開";
case "黒閃", "発" -> "虎杖悠仁の技";
default -> "その他の術式";
};
System.out.println(technique + ": " + techniqueType);
// --- switch式でブロックを使う(yield で値を返す)---
// 複数行の処理が必要なときはブロック { } を使い、yieldで値を返します
int cursedEnergyLevel = 85;
String powerRating = switch (cursedEnergyLevel / 20) { // 0〜5 の値になります
case 5 -> {
System.out.println("(特級レベルの呪力を検出)");
yield "特級(五条悟レベル)"; // yieldで値を返します
}
case 4 -> {
System.out.println("(1級レベルの呪力を検出)");
yield "1級クラス"; // ここが実行されます(85 / 20 = 4)
}
case 3 -> {
System.out.println("(準1級レベルの呪力を検出)");
yield "準1級クラス";
}
default -> {
System.out.println("(通常レベルの呪力を検出)");
yield "一般クラス";
}
};
System.out.println("呪力評価: " + powerRating);
}
}
コンパイルして実行すると次のようになります。
javac SwitchExpression.java java SwitchExpression 等級ラベル: 等級2(虎杖悠仁レベル) 赫: 五条悟の術式(順転・反転・虚式) (1級レベルの呪力を検出) 呪力評価: 1級クラス
SwitchEnum.java
public class SwitchEnum {
// 呪術廻戦の呪術師等級を表す列挙型(enum)です
enum SorcererGrade {
SPECIAL_GRADE, // 特1等級
GRADE_1, // 1等級
SEMI_GRADE_1, // 準1等級
GRADE_2, // 2等級
GRADE_3, // 3等級
GRADE_4 // 4等級
}
public static void main(String[] args) {
// --- enumとswitch式の組み合わせ ---
// enumを使うとすべての値が決まっているため、switch式のdefaultを省略できる場合があります
// ただし、コンパイラがすべてのcaseを網羅していることを確認するためdefaultを書くのが安全です
SorcererGrade grade = SorcererGrade.GRADE_1;
// switch式でenumの等級ごとにキャラクター名を返します
String representative = switch (grade) {
case SPECIAL_GRADE -> "五条悟・夏油傑";
case GRADE_1 -> "七海建人・乙骨憂太"; // ここが選択されます
case SEMI_GRADE_1 -> "東堂葵";
case GRADE_2 -> "虎杖悠仁(仮登録時)";
case GRADE_3 -> "一般的な術師";
case GRADE_4 -> "見習い術師";
};
System.out.println(grade + "の代表: " + representative);
// --- 従来のswitch文でenumを使う例 ---
SorcererGrade target = SorcererGrade.SPECIAL_GRADE;
System.out.println("\n=== 等級別の対処法(switch文)===");
switch (target) {
case SPECIAL_GRADE:
System.out.println("特1等級: 即時撤退か五条悟への応援要請が必要です。");
break;
case GRADE_1:
case SEMI_GRADE_1:
System.out.println("1等級・準1等級: 複数の呪術師で対応します。");
break;
default:
System.out.println("2等級以下: 通常の任務として対応可能です。");
break;
}
}
}
コンパイルして実行すると次のようになります。
javac SwitchEnum.java java SwitchEnum GRADE_1の代表: 七海建人・乙骨憂太 === 等級別の対処法(switch文)=== 特1等級: 即時撤退か五条悟への応援要請が必要です。
概要
switch 文はJava 7以降、String 型を分岐条件に使えるようになりました。ただし、null を渡すと NullPointerException がスローされるため、switch に渡す前に null チェックを行ってください。int・char・byte・short・String・enum が使えますが、long・float・double・boolean は使えません。
Java 14で正式化されたswitch式は、-> スタイルを使うことでフォールスルーが発生しないため、break を書き忘れるバグを防げます。また、switch式は文ではなく「式」なので変数への代入や返り値として使えます。ブロック内で複数行の処理が必要な場合は return ではなく yield で値を返す点に注意してください。
enum と組み合わせると分岐のパターンが型として明確になり、コンパイラが未処理のcaseを検出できるようになります。列挙型の詳細については『enum(列挙型)』を参照してください。複雑な条件分岐には if / else if も有効です。詳細は『if / else』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。