300 秒快速瞭解 Java 9 - 16 新特性,助你脫離內卷

300 秒快速瞭解 Java 9 - 16 新特性,助你脫離內卷

JAVA 這幾年的更新實在是太太太……快了,JAVA 8 都還沒用多久,16 都已經發布了。自從 JAVA 8 釋出了 Lambda 和 Stream 之後,JAVA 就像打了雞血一樣,半年一個版本的釋出,生產隊的驢也沒這麼勤快。

300 秒快速瞭解 Java 9 - 16 新特性,助你脫離內卷

導致我們現在完全跟不上 JAVA 釋出的節奏,我司目前還停留在 JAVA 8,甚至部分老系統還在使用 JAVA 7,根本不能輕易的升級。

不過雖然暫時用不上最新版本的 JAVA,但瞭解每個新版本的主要特性還是很重要的,不然哪天真跟著升級了,那還不得一臉懵逼。

本文就帶你快速瞭解 JAVA 9 - 16 的主要新特性,早學完早下班!

JAVA 9(2017年9月)

接口裡可以新增私有介面

JAVA 8 對介面增加了預設方法的支援,在 JAVA 9 中對該功能又來了一次升級,現在可以在接口裡定義私有方法,然後在預設方法裡呼叫介面的私有方法。

這樣一來,既可以重用私有方法裡的程式碼,又可以不公開程式碼

匿名內部類也支援鑽石(diamond)運算子

JAVA 5 就引入了泛型(generic),到了 JAVA 7 開始支援鑽石(diamond)運算子:,可以自動推斷泛型的型別:

但是這個自動推斷型別的鑽石運算子可不支援匿名內部類,在 JAVA 9 中也對匿名內部類做了支援:

增強的

JAVA 7 中增加了的支援,可以自動關閉資源:

但需要宣告多個資源變數時,程式碼看著就有點噁心了,需要在 try 中寫多個變數的建立過程:

JAVA 9 中對這個功能進行了增強,可以引用 try 程式碼塊之外的變數來自動關閉:

JAVA 10(2018年3月)

區域性變數的自動型別推斷(var)

JAVA 10 帶來了一個很有意思的語法 - ,它可以自動推斷區域性變數的型別,以後再也不用寫型別了,也不用靠 lombok 的 註解增強了

不過這個只是語法糖,編譯後變數還是有型別的,使用時還是考慮下可維護性的問題,不然寫多了可就成 JavaScript 風格了

JAVA 11(2018年9月)

Lambda 中的自動型別推斷(var)

JAVA 11 中對 Lambda 語法也支援了 這個自動型別推斷的變數,透過 var 變數還可以增加額外的註解:

javac + java 命令一把梭

以前編譯一個 java 檔案時,需要先 javac 編譯為 class,然後再用 java 執行,現在可以一把梭了:

Java Flight Recorder 登陸 OpenJDK

Java Flight Recorder

是個灰常好用的除錯診斷工具,不過之前是在 Oracle JDK 中,也跟著 JDK 11 開源了,OpenJDK 這下也可以用這個功能,真香!

JAVA 12(2019年3月)

更簡潔的 switch 語法

在之前的 JAVA 版本中, 語法還是比較囉嗦的,如果多個值走一個邏輯需要寫多個 :

到了 JAVA 12,這個事情就變得很簡單了,幾行搞定,而且!還支援返回值:

instanceof + 型別強轉一步到位

之前處理動態型別碰上要強轉時,需要先 判斷一下,然後再強轉為該型別處理:

現在 支援直接型別轉換了,不需要再來一次額外的強轉:

JAVA 13(2019年9月)

switch 語法再增強

JAVA 12 中雖然增強了 語法,但並不能在 之後寫複雜的邏輯,JAVA 12 帶來了 更完美的體驗,就像 一樣,可以寫邏輯,然後再返回:

文字塊(Text Block)的支援

你是否還在為大段帶換行符的字串報文所困擾,換行吧一堆換行符,不換行吧看著又難受:

JAVA 13 中幫你解決了這個噁心的問題,增加了文字塊的支援,現在可以開心的換行拼字串了,就像用模板一樣:

JAVA 14(2020年3月)

新增的 record 型別,幹掉複雜的 POJO 類

一般我們建立一個 POJO 類,需要定義屬性列表,建構函式,getter/setter,比較麻煩。JAVA 14 為我們帶來了一個便捷的建立類的方式 -

IDEA 也早已支援了這個功能,建立類的時候直接就可以選:

300 秒快速瞭解 Java 9 - 16 新特性,助你脫離內卷

不過這個只是一個語法糖,編譯後還是一個 Class,和普通的 Class 區別不大

更直觀的 NullPointerException 提示

NullPointerException

算是 JAVA 裡最常見的一個異常了,但這玩意提示實在不友好,遇到一些長一點的鏈式表示式時,沒辦法分辨到底是哪個物件為空。

比如下面這個例子中,到底是 為空呢,還是 為空呢?

JAVA 14 也 get 到了 JAVAER 們的痛點,優化了 NullPointerException 的提示,讓你不在困惑,一眼就能定位到底“空”在哪!

現在的 StackTrace 就很直觀了,直接告訴你 變數為空,再也不用困惑!

安全的堆外記憶體讀寫介面,別再玩 Unsafe 的騷操作了

在之前的版本中,JAVA 如果想操作堆外記憶體(DirectBuffer),還得 Unsafe 各種 copy/get/offset。現在直接增加了一套安全的堆外記憶體訪問介面,可以輕鬆的訪問堆外記憶體,再也不用搞 Unsafe 的騷操作了。

不瞭解 Unsafe 操作堆外記憶體方式的同學,可以參考我的另一篇文章《JDK中為了效能大量使用的Unsafe類,你會用嗎?》

新增的 jpackage 打包工具,直接打包二進位制程式,再也不用裝 JRE 了

之前如果想構建一個可執行的程式,還需要藉助三方工具,將 JRE 一起打包,或者讓客戶電腦也裝一個 JRE 才可以執行我們的 JAVA 程式。

現在 JAVA 直接內建了 打包工具,幫助你一鍵打包二進位制程式包,終於不用亂折騰了

JAVA 15(2020年9月)

ZGC 和 Shenandoah 兩款垃圾回收器正式登陸

在 JAVA 15中,ZGC 和 Shenandoah 再也不是實驗功能,正式登陸了(不過 G1 仍然是預設的)。如果你升級到 JAVA 15 以後的版本,就趕快試試吧,效能更強,延遲更低

封閉(Sealed )類

JAVA 的繼承目前只能選擇允許繼承和不允許繼承(final 修飾),現在新增了一個封閉(Sealed )類的特性,可以指定某些類才可以繼承:

JAVA 16(2021年3月)

JAVA 16 在

使用者可見的地方

變化並不多,基本都是 14/15 的實驗性內容,到了 16 正式釋出,這裡就不重複介紹了。

總結

以上介紹的各種新特性,有些特性在歷史版本中還屬於實驗性功能,不過按照 JAVA 目前這個驢一樣的更新頻率,很可能下個版本就是穩定版了。

早學早享受,晚學被捲走……

最近面試BAT,整理一份面試資料《

Java面試BATJ通關手冊

》,覆蓋了Java核心技術、JVM、Java併發、SSM、微服務、資料庫、資料結構等等。

文章有幫助的話,在看,轉發吧。

謝謝支援喲 (*^__^*)

TAG: Java語法型別可以支援