從Java 9 到 Java 17之Java 13
Java 13在2019年9月發布,這個版本引入的正式可用特性幾乎沒有,是我認為最無聊的版本之一。所以我們跳過Java 13直接來看Java 14吧。
Switch表達式
我覺得switch表達式在日常中開發被使用的太少了,不是因為這個關鍵字和if比起來太“難”,而是因為它很冗長,而且這種視覺上的噪聲容易掩蓋那些難以調試的錯誤,特別是那些break語句,就像下面這樣:
- switch (day) {
- case MONDAY:
- case FRIDAY:
- case SUNDAY:
- System.out.println(6);
- break;
- case TUESDAY:
- System.out.println(7);
- break;
- case THURSDAY:
- case SATURDAY:
- System.out.println(8);
- break;
- case WEDNESDAY:
- System.out.println(9);
- break;
- default:
- System.out.println(11);
- }
一點也不清晰,所以我寫Java時通常拒絕使用switch表達式。
新的switch標簽
為了簡化switch,Java在引入了 switch標簽case L ->這樣一個預覽特性,如果輸入匹配L,則僅執行標簽右側的代碼。我們還建議每個 case 允許多個常量,用逗號,分隔。之前的代碼現在可以寫成:
- switch (day) {
- case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
- case TUESDAY -> System.out.println(7);
- case THURSDAY, SATURDAY -> System.out.println(8);
- case WEDNESDAY -> System.out.println(9);
- default -> System.out.println(11);
- }
case L ->switch標簽右側的代碼被限制為表達式、代碼塊或throw語句。如果我們希望Switch語句有返回值可以這樣寫:
- int numLetters = switch (day) {
- case MONDAY, FRIDAY, SUNDAY -> 6;
- case TUESDAY -> 7;
- case THURSDAY, SATURDAY -> 8;
- case WEDNESDAY -> 9;
- default -> 11;
- };
當Switch語句賦值給變量時default分支是必須的。
yield 受限標識符
case L ->右邊是一個代碼塊而且根據case條件會產生一個值的情況下,根據我們的思維慣性會這樣寫:
- int numLetters = switch (day) {
- case WEDNESDAY -> {
- System.out.println("day = " + day);
- // 錯誤的寫法,會引發編譯錯誤
- return 9;
- };
- default -> 11;
- };
你會發現上面的寫法通不過編譯,這是語境問題,當滿足case條件時并不是返回(return)一個值的意思,而是產生(yield)了一個值。所以引入了一個新的受限標識符yield(注意不是關鍵字)來處理這個語境問題。
- int numLetters = switch (day) {
- case WEDNESDAY -> {
- System.out.println("day = " + day);
- // yield 才是正確的
- yield 9;
- };
- default -> 11;
- };
更合理的空指針提示
空指針異常是Java最常見的異常之一,在Java 14之前的空指針異常堆棧信息中只是提示給定行的發生了NullPointerException,不夠直觀清晰:
- Exception in thread "main" java.lang.NullPointerException
- at cn.felord.SomeClass.main(SomeClass.java:17)
現在日志會說明空指針的具體來源:
- Exception in thread "main" java.lang.NullPointerException: Cannot store to int array because "arr" is null
- at cn.felord.SomeClass.main(SomeClass.java:17)
我們可以明確地知道arr為null導致了空指針。
其它的一些變更
由于一些預覽特性并沒有轉正,甚至在未來可能移除,所以這里不再進行詳細的說明。感興趣的可以到Java 14發行日志[1]頁面查看。多多關注,點贊,轉發,評論,后續為大家帶來更多有價值的內容輸出。
參考資料
[1]Java 14發行日志: https://openjdk.java.net/projects/jdk/14/