Java 9 - 17 特性解讀:?Java 13

Java 13在2019年9月發(fā)布,這個版本引入的正式可用特性幾乎沒有,是我認為最無聊的版本之一。所以我們跳過Java 13直接來看Java 14吧。
Switch表達式
我覺得switch表達式在日常中開發(fā)被使用的太少了,不是因為這個關(guān)鍵字和if比起來太“難”,而是因為它很冗長,而且這種視覺上的噪聲容易掩蓋那些難以調(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);????
}
一點也不清晰,所以我寫Java時通常拒絕使用switch表達式。
新的switch標簽
為了簡化switch,Java在引入了 switch標簽case L ->這樣一個特性,如果輸入匹配L,則僅執(zhí)行標簽右側(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標簽右側(cè)的代碼被限制為表達式、代碼塊或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分支是必須的。
如果您正在學(xué)習(xí)Spring Cloud,推薦一個經(jīng)典教程(含Spring Cloud Alibaba):https://blog.didispace.com/spring-cloud-learning/
yield 受限標識符
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)上面的寫法通不過編譯,這是語境問題,當滿足case條件時并不是返回(return)一個值的意思,而是產(chǎn)生(yield)了一個值。所以引入了一個新的受限標識符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)致了空指針。
最近有小伙伴吐槽?2021.3?升級后不能無限試用了,正好看到一個方法,大家可以關(guān)注公眾號?TJ君,回復(fù)IDEA2021.3,試試看吧
其它的一些變更
由于一些預(yù)覽特性并沒有轉(zhuǎn)正,甚至在未來可能移除,所以這里不再進行詳細的說明。感興趣的可以到Java 14發(fā)行日志[1]頁面查看。多多關(guān)注,點贊,轉(zhuǎn)發(fā),評論,后續(xù)為大家?guī)砀嘤袃r值的內(nèi)容輸出。
參考資料
[1]Java 14發(fā)行日志: https://openjdk.java.net/projects/jdk/14/
往期推薦
推薦關(guān)注本文作者:碼農(nóng)小胖哥
分享高質(zhì)量編程知識,探討IT人生
