Switch Expression

Java 12 & Java 13 - Enhanced Switch Expression (Preview)

林逸澄 Ethan Lin 2019/11/19 17:03:12
2643

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)

 

 

林逸澄 Ethan Lin