1. 程式人生 > >JDK15正式釋出,新增功能預覽!

JDK15正式釋出,新增功能預覽!

JDK 15 在 2020 年 9 月 15 號正式釋出了,這次釋出的主要功能有: - JEP 339:EdDSA 數字簽名演算法 - JEP 360:密封類(預覽) - JEP 371:隱藏類 - JEP 372:刪除 Nashorn JavaScript 引擎 - JEP 373:重新實現 Legacy DatagramSocket API - JEP 374:重新實現 DatagramSocket API - JEP 375:例項模式匹配(第二次預覽) - JEP 377:ZGC:一個可擴充套件的低延遲垃圾收集器 - JEP 378:文字塊 - JEP 379:低暫停時間垃圾收集器 - JEP 381:移除 Solaris 和 SPARC 埠 - JEP 383:外部儲存器訪問 API(第二個內建程式) - JEP 384:Records(第二次預覽) - JEP 385:不推薦的 RMI 啟用去除 > JEP:JDK Enhancement Proposals,JDK 增強建議,也就是 JDK 的特性新增和改進提案。 這些年釋出的版本對應的 JEPs 數量如下圖所示: ![image.png](https://cdn.nlark.com/yuque/0/2020/png/92791/1600244328984-d6a2167c-2ba8-4fbe-b1f7-d67c8758333f.png#align=left&display=inline&height=252&margin=%5Bobject%20Object%5D&name=image.png&originHeight=504&originWidth=1036&size=95216&status=done&style=none&width=518) ### 釋出版本說明 根據釋出的規劃,這次釋出的 JDK 15 將是一個短期的過度版,只會被 Oracle 支援(維護)6 個月,直到明年 3 月的 JDK 16 釋出此版本將停止維護。而 Oracle 下一個長期支援版(LTS 版)會在明年的 9 月份候釋出(Java 17),LTS 版每 3 年釋出一個,上一次長期支援版是 18 年 9 月釋出的 JDK 11。 ### JDK 15 新功能說明 JDK 15 為使用者提供了十四項主要的增強/更改,包括一個孵化器模組,三個預覽功能,兩個不推薦使用的功能以及兩個刪除功能。 #### 1、EdDSA 數字簽名演算法 新加入 Edwards-Curve 數字簽名演算法(EdDSA)實現加密簽名。在許多其它加密庫(如 OpenSSL 和 BoringSSL)中得到支援。與 JDK 中的現有簽名方案相比,EdDSA 具有更高的安全性和效能。這是一個新的功能。 #### 2、隱藏類 此功能可幫助需要在執行時生成類的框架。框架生成類需要動態擴充套件其行為,但是又希望限制對這些類的訪問。隱藏類很有用,因為它們只能通過反射訪問,而不能從普通位元組碼訪問。此外,隱藏類可以獨立於其他類載入,這可以減少框架的記憶體佔用。這是一個新的功能。 #### 3、重新實現 DatagramSocket API 重新實現舊版 DatagramSocket API,更簡單、更現代的實現來代替`java.net.DatagramSocket`和`java.net.MulticastSocket`API 的基礎實現,提高了 JDK 的可維護性和穩定性。 #### 4、ZGC 功能轉正 ZGC 已由JEP 333整合到JDK 11 中,其目標是通過減少 GC 停頓時間來提高效能。藉助 JEP 377,ZGC 從預覽功能轉變為生產功能。 #### 5、文字塊功能轉正 文字塊由JEP 355在 2019 年提出,文字塊是一種多行字串文字,它避免了大多數轉義序列的需要,以一種可預測的方式自動設定字串的格式,並在需要時使開發人員可以控制格式。藉助 JEP 378,文字塊已成為 Java 語言的永久功能。 #### 6、Shenandoah 垃圾回收演算法轉正 Shenandoah 垃圾回收從實驗特性變為產品特性。這是一個從 JDK 12 引入的回收演算法,該演算法通過與正在執行的 Java 執行緒同時進行疏散工作來減少 GC 暫停時間。Shenandoah 的暫停時間與堆大小無關,無論堆疊是 200 MB 還是 200 GB,都具有相同的一致暫停時間。 #### 7、密封類(預覽) 通過密封的類和介面來增強 Java 程式語言,用於限制超類的使用,密封的類和介面限制其它可能繼承或實現它們的其它類或介面。 #### 8、instanceof 自動匹配模式(預覽) **舊寫法:** ```java // 先判斷型別 if (obj instanceof String) { // 然後轉換 String s = (String) obj; // 然後才能使用 } ``` **新寫法:** ```java if (obj instanceof String s) { // 如果型別匹配 直接使用 } else { // 如果型別不匹配則不能直接使用 } ``` 這是第二次預覽該功能,我們已經在 Java 14 中首次預覽過該特性。 #### 9、Records Class(預覽) Records Class 也是第二次出現的預覽功能,它在 JDK 14 中也出現過一次了,使用 Record 可以更方便的建立一個常量類,使用的前後程式碼對比如下。 **舊寫法:** ```java class Point { private final int x; private final int y; Point(int x, int y) { this.x = x; this.y = y; } int x() { return x; } int y() { return y; } public boolean equals(Object o) { if (!(o instanceof Point)) return false; Point other = (Point) o; return other.x == x && other.y = y; } public int hashCode() { return Objects.hash(x, y); } public String toString() { return String.format("Point[x=%d, y=%d]", x, y); } } ``` **新寫法:** ```java record Point(int x, int y) { } ``` 也就是說在使用了 record 之後,就可以用一行程式碼編寫出一個常量類,並且這個常量類還包含了構造方法、toString()、equals() 和 hashCode() 等方法。 #### 10、外部儲存器訪問 API(預覽) 目的是引入一個 API,以允許 Java 程式安全有效地訪問 Java 堆之外的外部記憶體。這同樣是 Java 14 的一個預覽特性。 #### 11、其它功能 其它功能裡面還有一些棄用和不建議使用的功能,比如移除了 Nashorn JavaScript 引擎,同時也移除了刪除 Solaris 和 SPARC 埠,並標記了一些棄用功能。 #### 參考 & 鳴謝 碼農小胖哥:https://mp.weixin.qq.com/s/rhfSLW0wfe73xgbRVvX46Q 官方日誌:https://openjdk.java.net/projects