switch (表達式) {
case 常量表達式1: 語句1; break;
case 常量表達式2: 語句2; break;
...
default: 語句;
}
default 非必要,無匹配 case 時執行。int、byte、short、char、String(Java 7+)、enum(Java 5+)。不支援 long、float、double、boolean。break 或結尾。善用此特性可合併多 case 共用邏輯。int i = 3;
switch (i) {
case 1: System.out.println(1); break;
case 2: System.out.println(2); break;
case 3: System.out.println(3); break;
default: System.out.println("default"); break;
}
// 輸出:3
int month = 3, day;
switch (month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
day = 31; break;
case 2:
day = 28; break; // 簡化未考慮閏年
case 4: case 6: case 9: case 11:
day = 30; break;
}
// month=3 → day=31
int i = 1;
switch (i) {
case 1:
System.out.println(1);
default:
System.out.println("default");
case 2:
System.out.println(2);
break;
case 3:
System.out.println(3);
break;
}
// 輸出:
// 1
// default
// 2
解析:case 1 無 break,落入 default,再落入 case 2 遇 break 才停。default 位置不影響匹配順序,只影響落入路徑。
// 表達式寫法,直接賦值
String result = switch (day) {
case 1, 2, 3, 4, 5 -> "工作日";
case 6, 7 -> "週末";
default -> "錯誤";
};
// 區塊寫法,需用 yield 回傳
int score = switch (grade) {
case 'A' -> 90;
case 'B' -> 80;
case 'C' -> {
int base = 70;
yield base + 5; // 區塊中用 yield
}
default -> 0;
};
case 1, 2, 3 取代多行 case。break Bug。
static String formatter(Object obj) {
return switch (obj) {
case Integer i -> "整數:" + i;
case Long l -> "長整數:" + l;
case Double d -> "浮點數:" + d;
case String s -> "字串:" + s;
case null -> "空值";
default -> obj.getClass().getSimpleName() + ":" + obj;
};
}
威力:型別檢查、轉型、綁定變數一行搞定,告別 instanceof + 強轉樣板碼。
| 常見錯誤 | 正確做法 |
|---|---|
| case 使用變數而非常量 | case 後必須是編譯期常量(final 變數、字面值、enum) |
| 忘記 break 導致邏輯錯誤 | 改用 Java 12+ 箭頭語法,或加上 // fall through 註釋 |
| String switch 傳 null 丟 NPE | Java 17+ 可直接 case null;舊版先判 null |
| long/float/double 型別直接用 | 轉換為 int/String/enum,或改用 if-else |
從傳統 switch 到現代 switch expression、pattern matching,Java 持續降低樣板碼與 Bug 率。建議:新專案直接用箭頭語法;舊代碼逐步遷移;涉及型別判斷優先考慮模式匹配。