編譯 | ChatGPT 責(zé)編 | 蘇宓
出品 | CSDN(ID:CSDNnews)
9 月 19 日,以六個(gè)月為更新頻次的 Java 正式發(fā)布了最新的長(zhǎng)期支持版本——Java 21,這一版本將獲得官方 5 年重要的支持,這意味著對(duì)于開發(fā)者、企業(yè)而言,如果想要用上穩(wěn)定又前沿的 Java,JDK 21 無疑是最好的選擇。
在最新的 Java 21 版本中, Oracle 開發(fā)團(tuán)隊(duì)為其帶來了 15 大功能更新,詳細(xì)如下:
字符串模板(預(yù)覽階段)
該功能通過將文字文本與嵌入式表達(dá)式和處理器相結(jié)合來產(chǎn)生專門的結(jié)果,從而補(bǔ)充了 Java 現(xiàn)有的字符串文字和文本塊。該語言功能和 API 的目的是通過輕松表達(dá)包含運(yùn)行時(shí)計(jì)算值的字符串來簡(jiǎn)化 Java 程序的編寫。它有望增強(qiáng)表達(dá)式的可讀性,提高程序的安全性,保持靈活性,并簡(jiǎn)化接受用非 Java 語言編寫的字符串的 API 的使用。
序列集合
有序集合提案引入了一些接口,用于表示具有已定義遇到順序的集合。每個(gè)集合都有明確定義的第一個(gè)和第二個(gè)元素,以此類推,直到最后一個(gè)元素。提供了一致的 API,用于接受第一個(gè)和最后一個(gè)元素以及以相反順序處理元素。該提案的提出的原因是,Java 的集合框架缺乏一種表示具有定義的遇到順序的元素序列的集合類型。它還缺乏適用于這些集合的一致的操作集。該提案要求定義順序集合、集合和映射的接口,并將這些接口適應(yīng)到現(xiàn)有的集合類型層次結(jié)構(gòu)中。所有這些新方法都具有默認(rèn)實(shí)現(xiàn)。
加入 Generational ZGC
分代 ZGC 的目的是通過擴(kuò)展 ZGC,維護(hù)新舊對(duì)象的不同代,從而提高應(yīng)用程序的性能。年輕的對(duì)象往往很早就會(huì)死亡;保持獨(dú)立的世代將允許 ZGC 更頻繁地收集年輕對(duì)象。使用分代 ZGC 運(yùn)行的應(yīng)用程序應(yīng)能獲得以下優(yōu)勢(shì):降低分配停滯的風(fēng)險(xiǎn)、降低堆內(nèi)存開銷和降低垃圾回收 CPU 開銷。與非分代 ZGC 相比,這些優(yōu)勢(shì)應(yīng)該可以實(shí)現(xiàn),而不會(huì)顯著降低吞吐量。
記錄模式
該功能在 JDK 19 和 JDK 20 中都是預(yù)覽版,主要用于解構(gòu)記錄值。記錄模式和類型模式可以嵌套,以實(shí)現(xiàn)強(qiáng)大、聲明性和可組合的數(shù)據(jù)導(dǎo)航和處理形式。該提案的目標(biāo)包括將模式匹配擴(kuò)展到重組記錄類實(shí)例,并添加嵌套模式,從而實(shí)現(xiàn)更多可組合的數(shù)據(jù)查詢。當(dāng)前 JEP(JDK 增強(qiáng)提案)中的記錄模式提案將最終確定該功能,并根據(jù)不斷積累的經(jīng)驗(yàn)和反饋意見進(jìn)一步完善。
switch 模式匹配
該功能允許 switch 表達(dá)式或語句可以根據(jù)多個(gè)模式(每個(gè)模式都有特定的操作)進(jìn)行測(cè)試,從而可以安全、簡(jiǎn)潔地表達(dá)面向數(shù)據(jù)的復(fù)雜查詢。該功能最初在 JDK 17 中提出,隨后在 JDK 18、JDK 19 和 JDK 20 中得到改進(jìn)。它將在 JDK 21 中最終完成,并根據(jù)反饋和經(jīng)驗(yàn)進(jìn)一步完善。與以前的 JEP 相比,主要的變化是刪除了括號(hào)模式,并允許使用限定的枚舉常量(如帶有 switch 表達(dá)式和語句的 case 常量)。
外部函數(shù)與內(nèi)存 API(第三次預(yù)覽)
允許 Java 程序與 Java 運(yùn)行時(shí)之外的代碼和數(shù)據(jù)進(jìn)行互操作。通過有效地調(diào)用外部函數(shù)和安全訪問外部?jī)?nèi)存,該 API 使 Java 程序能夠調(diào)用本地庫并處理本機(jī)數(shù)據(jù),而不會(huì)出現(xiàn) JNI(Java Native Interface)的脆弱性和危險(xiǎn)性。該 API 先前在 JDK 20 和 JDK 19 中進(jìn)行了預(yù)覽。JDK 21 預(yù)覽中的改進(jìn)包括增強(qiáng)的布局路徑,增加了一個(gè)用于取消引用地址布局的新元素,以及集中管理 Arena 接口中本地段的生命周期;實(shí)現(xiàn)了一個(gè)后備本地鏈接器;刪除了 VaList。
未命名模式和變量(預(yù)覽版)
未命名模式匹配記錄組件,但不說明組件名稱或類型,而未命名變量可以初始化但不能使用。兩者都用下劃線字符 _ 表示。該提案旨在通過省略不必要的嵌套模式來提高記錄模式的可讀性,并通過識(shí)別必須聲明但不會(huì)使用的變量來提高所有代碼的可維護(hù)性。
虛擬線程
虛擬線程是一種輕量級(jí)線程,有望大幅減少編寫、維護(hù)和觀察高吞吐量并發(fā)應(yīng)用程序的工作量。在 JDK 21 中,虛擬線程將始終支持線程本地變量,并使創(chuàng)建不具備這些變量的虛擬線程成為不可能。對(duì)線程本地變量的有保證的支持確保更多的現(xiàn)有庫可以不改變地與虛擬線程一起使用,并幫助遷移任務(wù)導(dǎo)向的代碼以使用虛擬線程。
未命名類和實(shí)例主要方法(處于預(yù)覽階段)
該功能的作用是為了讓學(xué)生能夠更容易地編寫出第一個(gè) Java 程序,而無需了解為大型程序設(shè)計(jì)的語言功能。學(xué)生無需使用單獨(dú)的 Java 方言,就能編寫單類程序的精簡(jiǎn)聲明,然后隨著技能的提高,無縫擴(kuò)展程序,使用更高級(jí)的功能。該提案不僅為學(xué)生提供了通往 Java 的平坦道路,還減少了編寫腳本和命令行實(shí)用程序等簡(jiǎn)單 Java 程序的繁瑣過程。
作用域值(處于預(yù)覽階段)
作用域值(Scoped values)是指允許在線程內(nèi)和線程間共享不可變數(shù)據(jù)。作用域值允許在大型程序的組件之間安全地共享數(shù)據(jù),而無需使用方法參數(shù)。這一提議在 JDK 20 中得到了驗(yàn)證。該計(jì)劃的目標(biāo)包括易用性、可理解性、健壯性和性能。
矢量 API(第六個(gè)孵化器)
該 API 表達(dá)的矢量計(jì)算可在支持的 CPU 架構(gòu)上可靠地編譯為最佳矢量指令,從而實(shí)現(xiàn)優(yōu)于同等標(biāo)量計(jì)算的性能。此前,矢量 API 已在 JDK 16 至 JDK 20 中孵化。最新版本包括性能增強(qiáng)和錯(cuò)誤修復(fù)。該提案的目標(biāo)包括:簡(jiǎn)潔明了、與平臺(tái)無關(guān)、在 x64 和 AArch64 體系結(jié)構(gòu)上提供可靠的運(yùn)行時(shí)編譯和性能。
棄用 Windows 32 位 x86 端口
這個(gè)功能更新的目的是在未來的版本中刪除該端口。該提案旨在更新構(gòu)建系統(tǒng),以便在嘗試為 32 位 x86 Windows 配置構(gòu)建時(shí),發(fā)出錯(cuò)誤消息。該提案指出,支持 32 位操作的最后一個(gè) Windows 操作系統(tǒng)版本之 Windows 10 將于 2025 年 10 月終止生命周期。
禁止代理的動(dòng)態(tài)加載
當(dāng)代理被動(dòng)態(tài)加載到運(yùn)行中的 JVM 時(shí)發(fā)出警告。發(fā)出這些警告的目的是為將來發(fā)布默認(rèn)禁止加載代理的版本做準(zhǔn)備,以改善默認(rèn)情況下的完整性。該提案的其他目標(biāo)包括重新評(píng)估服務(wù)性(涉及對(duì)運(yùn)行中代碼的臨時(shí)更改)和完整性(假定運(yùn)行中的代碼不會(huì)被隨意更改)之間的平衡,并確保大多數(shù)不需要?jiǎng)討B(tài)加載代理的工具不受影響。從 JDK 21 開始,計(jì)劃要求應(yīng)用程序所有者批準(zhǔn)動(dòng)態(tài)加載代理,就像啟動(dòng)時(shí)加載代理一樣。這個(gè)改變將使 Java 平臺(tái)更接近默認(rèn)情況下的完整性。
密鑰封裝機(jī)制的 API
這一種通過公開密碼學(xué)保護(hù)對(duì)稱密鑰的加密技術(shù)。該提案的一個(gè)目標(biāo)是使應(yīng)用程序能夠使用 KEM 算法,如 RSA 密鑰封裝機(jī)制(RSA-KEM)、橢圓曲線集成加密方案(ECIES)和美國國家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)后量子密碼標(biāo)準(zhǔn)化過程的候選算法。另一個(gè)目標(biāo)是在更高級(jí)別的協(xié)議(如傳輸層安全性(TLS))和密碼方案(如混合公鑰加密(HPKE))中使用 KEM。安全提供商可以在 Java 代碼或本地代碼中實(shí)現(xiàn) KEM 算法,并包括在 RFC 9180 中定義的 Diffie-Hellman KEM(DHKEM)的實(shí)現(xiàn)。
結(jié)構(gòu)化并發(fā)(目前處于預(yù)覽階段)
通過結(jié)構(gòu)化并發(fā) API 簡(jiǎn)化并發(fā)編程,將在不同線程中運(yùn)行的相關(guān)任務(wù)組視為單個(gè)工作單元。這簡(jiǎn)化了錯(cuò)誤處理和取消操作,提高了可靠性并增強(qiáng)了可觀察性。結(jié)構(gòu)化并發(fā)之前分別于 2022 年 3 月和 9 月在 JDK 20 和 JDK 19 中孵化,它作為 java.util.concurrent 包中的一個(gè)預(yù)覽 API。這次唯一的重大變化是,StructuredTaskScope::Fork(...) 方法返回的是 [Subtask] 而不是 Future。結(jié)構(gòu)化并發(fā)的目標(biāo)包括促進(jìn)一種并發(fā)編程風(fēng)格,這種風(fēng)格可以消除因取消和關(guān)閉而產(chǎn)生的常見風(fēng)險(xiǎn)(如線程泄漏和取消延遲),同時(shí)提高并發(fā)代碼的可觀察性。