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