Java 12 & Java 13 - Enhanced Switch Expression (Preview)
Java 12 & Java 13 - Enhanced Switch Expression (Preview)
前言
Switch Expressions 在 Java 12 版本開始,以實驗性的 feature方式引進 (Priview),而在Java 13時更一步的引進了 yield
這個keywork去 "yielding a value",此為依據JEP 354所定義的規格。
以下我們用一些實際的code來比較 switch在傳統寫法與Java 12, Java 13的差異,由於是preview feature,必須透過enable才能使用,否則就會產生compile error (Java 14, JEP 361目前是有列入standard); 如果使用 Java IDE做測試,如: eclipse, 要確認有支援Java 13的版本,以下以Eclipse作為範例。
Enable preview features
[Eclipse設定]
由於下載的版本 2019-09 R (4.13.0),目前僅支援到 Java 12,必須先利用 patch方式更新來支援 Java 13,方式如下圖:
(https://download.eclipse.org/eclipse/updates/4.13-P-builds/)
接著enable preview features,在編輯的java檔案內直接enable:
或者也可以直接在Project->Properties中設定
[Command Line]
javac --release 13 --enable-preview xxxxx.java // Enable all preview features of JDK 13
javac --release 12 --enable-preview xxxxx.java // Enable all preview features of JDK 12
java --enable-preview xxxxx // Run with preview features of JDK 13
No more value breaks
傳統java使用switch statement,主要依循C, C++的語法,single value case 加上optional break的設計,但在不同case相同行為時,使用fall through的方式處理就會容易 error-prone。
//traditional
private static int traditionalSwitch(String mode) {
int returnValue= 0;
switch(mode) {
case "a":
case "b":
returnValue = 1;
break;
case "c":
returnValue = 2;
break;
case "d":
case "e":
case "f":
returnValue = 2;
break;
default:
returnValue = -1;
}
return returnValue;
}
Java 12 Switch Expressions
Java 12增加可以支援multiple value用逗號分開的方式,加上Arrow語法,拿掉break這keyword,讓整個code更簡潔而容易debug; 同時支援expression方式,可以直接將switch結果直接assign給變數,但語法上必須加上 ;
作為結尾。參考如下:
// Jdk 12, multiple comma-separated
private static int jdk12SwitchWithMultipleComma(String mode) {
int returnValue=0;
switch (mode) {
case "a", "b":
returnValue = 1;
break;
case "c":
returnValue = 2;
break;
case "d", "e", "f":
returnValue = 3;
break;
default:
returnValue = -1;
}
return returnValue;
}
// Jdk12 multiple comma-separated, arrow syntax
private static int jdk12SwitchWithArrow(String mode) {
int returnValue = switch (mode) {
case "a", "b" -> 1;
case "c" -> 2;
case "d", "e", "f" -> 3;
default -> -1;
};
return returnValue;
}
Java 13 Switch Expressions
Java 13 則增加 yield
這個 keyword,除了可直接配合傳統的case label方式使用外,遇到需要一個完整的程式區塊時,可以使用 yield
來產生一個結果值。參考如下:
//Java 13, a traditional switch and yield keyword
private static int jdk13SwitchViaYield(String mode) {
int returnValue = switch (mode) {
case "a", "b":
yield 1;
case "c":
yield 2;
case "d", "e", "f" :
yield 3;
default:
yield -1;
};
return returnValue;
}
//Java 13, yileding a result of full block
private static int jdk13SwitchViaYieldBlock(String mode) {
int returnValue = switch (mode) {
case "a", "b" -> 1;
case "c" -> 2;
case "d", "e", "f" -> {
int result = 3;
yield result;
}
default -> -1;
};
return returnValue;
}
Summary
• Java 12, Java13的switch expression新features,需要特別去enable才能使用。
• 新features可以支援case multiple values。
• 可以使用->
語法, 避開fall-through方式, 也不需要 break
• 同一switch內不能 case:
and case ->
不能混合使用。
• 不論是switch statements 或是switch expressions,都可搭配使用->
or :
的語法。
參考
JEP 325: Switch Expressions (Preview)
JEP 354: Switch Expressions (Preview)
JEP 361: Switch Expressions (Standard)