JDK 新特性
引入模塊
Java 9 開始引入了模塊(Module),目的是為了管理依賴。使用模塊可以按需打包 JRE 和進一步限制類的訪問權限。
接口支持私有方法
JAVA 9 開始,接口里可以添加私有方法,JAVA 8 對接口增加了默認方法的支持,在 JAVA 9 中對該功能又來了一次升級,現在可以在接口里定義私有方法,然后在默認方法里調用接口的私有方法。這樣一來,既可以重用私有方法里的代碼,又可以不公開代碼。
匿名內部類支持鉆石(diamond)運算符
JAVA 5 就引入了泛型(generic),到了 JAVA 7 開始支持鉆石(diamond)運算符:<>,可以自動推斷泛型的類型;但是這個自動推斷類型的鉆石運算符不支持匿名內部類,在 JAVA 9 中也對匿名內部類做了支持。
增強的 try-with-resources
JAVA 7 中增加了try-with-resources的支持,可以自動關閉資源,但需要聲明多個資源變量時,需要在 try 中寫多個變量的創建過程,JAVA 9 中對這個功能進行了增強,可以引用 try 代碼塊之外的變量來自動關閉。
棄用 new Integer()
JAVA 9 開始棄用了 new Integer() 的方式來創建 Integer 對象,推薦通過靜態工廠 Integer.valueOf() 的方式來替代,其它包裝類類似。
局部變量的自動類型推斷(var)
JAVA 10 帶來了一個很有意思的語法 var,它可以自動推斷局部變量的類型,以后再也不用寫類型了,也不用靠 lombok 的 var 注解增強了,不過這個只是語法糖,編譯后變量還是有類型的。
for (var c : CacheConsts.CacheEnum.values()) {if (c.isLocal()) {Caffeine<Object, Object> caffeine = Caffeine.newBuilder().recordStats().maximumSize(c.getMaxSize());if (c.getTtl() > 0) {caffeine.expireAfterWrite(Duration.ofSeconds(c.getTtl()));}caches.add(new CaffeineCache(c.getName(), caffeine.build()));}}
java 命令增強
以前編譯一個 java 文件時,需要先 javac 編譯為 class,然后再用 java 執行,JAVA 11 之后可以直接使用 java 命令。
Java Flight Recorder 開源
「Java Flight Recorder」 是個非常好用的調試診斷工具,不過之前是在 Oracle JDK 中, JAVA 11 后就開源了,OpenJDK 現在也可以用這個功能。
文本塊(Text Block)的支持
JAVA 13 中幫你解決了
大段帶換行符的字符串報文
的問題,增加了文本塊(""")的支持,可以不通過換行符換行拼字符串,而且不需要轉義特殊字符,就像用模板一樣。新增 record 類型
JAVA 14 新增 record 類型,干掉復雜的 POJO 類,一般我們創建一個 POJO 類,需要定義屬性列表,構造函數,getter/setter方法,比較麻煩,JAVA 14 為我們帶來了一個便捷的創建類的方式 - record。
不過這個只是一個語法糖,編譯后還是一個 Class,和普通的 Class 區別不大。
@ConfigurationProperties(prefix = "novel.cors") public record CorsProperties(List<String> allowOrigins) {}
更直觀的 NullPointerException 提示
JAVA 14 優化了 NullPointerException 的提示,讓你更容易定位到哪個對象為空。
switch 語法增強
switch 從 JDK 14 開始可以通過
yield
關鍵字來生成結果,并且支持箭頭語法取代case
后面的冒號,使用箭頭語法后每個 case 語句后面也無需再加上 break;JDK 17 支持了 case null 的用法。新增 jpackage 打包工具
JAVA 14 新增 jpackage 打包工具,可以直接打包二進制程序,再也不用裝 JRE 了。
之前如果想構建一個可執行的程序,還需要借助三方工具,將 JRE 一起打包,或者讓客戶電腦也裝一個 JRE 才可以運行我們的 JAVA 程序。
現在 JAVA 直接內置了 jpackage 打包工具,幫助你一鍵打包二進制程序包。
新增封閉(Sealed )類
JAVA 的繼承以前只能選擇允許繼承和不允許繼承(final 修飾),JAVA 15 新增了一個封閉(Sealed )類的特性,可以指定某些類才可以繼承。
新增垃圾回收器
JAVA 15 中,兩款垃圾回收器ZGC 和 Shenandoah 正式登陸(默認 G1 ),性能更強,延遲更低。
instanceof 智能轉型
之前處理動態類型碰上要強轉時,需要先 instanceof 判斷一下,然后再強轉為該類型處理,JDK 16 最終完成了 JEP 394 的定稿,針對 instanceof 智能轉換變量類型,不需要再來一次額外的強轉,語法:
x instanceof String s
。引入虛擬線程
Java 21 中,引入了一種輕量級的線程實現方式-虛擬線程(Virtual Threads),能夠大幅提高 Java 的并發能力,被很多人稱作是史詩級的更新。