Java SE 17 發布

經過六個月的開發,Oracle 發布了 Java SE 17(Java Platform, Standard Edition 17)平台,該平台使用 OpenJDK 開源項目作為參考實現。 除了刪除了一些已棄用的功能外,Java SE 17 保持與以前版本的 Java 平台的向後兼容性——大多數以前編寫的 Java 項目在新版本下運行時仍無需修改即可運行。 Java SE 17(JDK、JRE 和 Server JRE)的可安裝版本已為 Linux(x86_64、AArch64)、Windows(x86_64)和 macOS(x86_64、AArch64)準備。 Java 17 參考實現由 OpenJDK 項目開發,在 GPLv2 許可下完全開源,具有 GNU ClassPath 例外,允許動態鏈接到商業產品。

Java SE 17 被歸類為長期支援 (LTS) 版本,將繼續接收更新直到 2029 年。 先前 Java 16 里程碑版本的更新已停止。 Java 11 之前的 LTS 分支將支援到 2026 年。 下一個 LTS 版本計劃於 2024 年 10 月發布。 讓我們提醒您,從Java XNUMX發布開始,該專案切換到了新的開發流程,這意味著新版本的形成週期更短。 現在,新功能是在一個不斷更新的主分支中開發的,其中包括現成的更改,並且每六個月從該分支分支一次以穩定新版本。

Java 17 的新特性包括:

  • 提出了「switch」表達式中模式匹配的實驗性實現,它允許在「case」標籤中使用不精確的值,而是一次覆蓋一系列值的靈活模板,而以前必須使用繁瑣的模板「if. ..else”表達式鏈。 此外,「switch」具有處理NULL值的能力。 對象 o = 123L; 字串格式化 = switch (o) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); 預設 -> o.toString(); };
  • 對密封類別和介面的穩定支持,其他類別和介面不能使用它們來繼承、擴展或重寫實作。 密封類別還提供了一種比存取修飾符更具聲明性的方法來限制超類別的使用,基於明確列出允許擴展的子類別。 包 com.example.geometry; 公共密封類別 Shape 允許 com.example.polar.Circle、com.example.quad.Rectangle、com.example.quad.simple.Square {…}
  • 提出了 Vector API 的第二個預覽版,它提供了向量計算的函數,這些函數在 x86_64 和 AArch64 處理器上使用向量指令執行,並允許同時將運算應用於多個值 (SIMD)。 與 HotSpot JIT 編譯器中提供的標量操作自動向量化功能不同,新 API 可以明確控制平行資料處理的向量化。
  • 新增了外部函數和記憶體 API 的預覽,該 API 允許應用程式與 Java 運行時以外的程式碼和資料進行互動。 新的 API 可讓您有效率地呼叫非 JVM 函數並存取非 JVM 管理的記憶體。 例如,您可以從外部共用程式庫呼叫函數並存取流程數據,而無需使用 JNI。
  • 為 Java 2D API 提供支援的 macOS 渲染引擎,進而為 Swing API 提供支持,已進行了調整以使用 Metal 圖形 API。 macOS 平台預設繼續使用 OpenGL,啟用 Metal 支援需要設定「-Dsun.java2d.metal=true」並且至少執行 macOS 10.14.x。
  • 新增了針對 macOS/AArch64 平台(基於新 Apple M1 晶片的 Apple 電腦)的連接埠。 此連接埠的一個特殊功能是支援W^X(寫入異或執行)記憶體保護機制,其中記憶體頁面不能同時存取以進行寫入和執行。 (程式碼只有在禁止寫入後才能執行,並且只有在禁止執行後才可以寫入記憶體頁)。
  • 恢復為僅對浮點表達式使用嚴格的fp 語意。 自 Java 1.2 發布以來,對「預設」語意的支援已停止,包括對具有非常舊的 x87 數學協處理器的系統的工作簡化(在 SSE2 指令出現後,對附加語義的需求消失了)。
  • 已經實現了偽隨機數生成器的新型接口,並且還實現了其他演算法以更好地生成隨機數。 應用程式有機會選擇產生偽隨機數的演算法。 改進了對產生隨機物件流的支援。
  • 對所有 JDK 內部進行嚴格封裝,但關鍵 API(如 sun.misc.Unsafe 除外)。 嚴格的封裝會阻止程式碼存取內部類別、方法和欄位的嘗試。 以前,可以使用「--illegal-access=permit」選項來停用嚴格封裝模式,但現已棄用。 需要存取內部類別、方法和欄位的應用程式應使用清單檔案中的 --add-opens 選項或 Add-Opens 屬性明確定義它們。
  • 應用程式能夠定義資料反序列化過濾器,這些過濾器可以是上下文相關的,並且可以根據特定的反序列化操作動態選擇。 指定的過濾器適用於整個虛擬機器(JVM 範圍),即不僅涵蓋應用程式本身,還涵蓋應用程式中使用的第三方程式庫。
  • Swing 新增了 javax.swing.filechooser.FileSystemView.getSystemIcon 方法來載入大圖標,以改進高 DPI 螢幕上的 UI。
  • java.net.DatagramSocket API 提供連接到多重播放群組的支持,而無需單獨的 java.net.MulticastSocket API。
  • IGV(理想圖形視覺化工具)實用程式已改進,可在 HotSpot VM C2 JIT 編譯器中提供中間程式碼表示的互動式視覺化。
  • 在JavaDoc中,與javac編譯器類比,當輸出錯誤時,現在會指示原始檔中有問題的行號以及錯誤的位置。
  • 新增了native.encoding屬性,反映系統字元編碼的名稱(UTF-8、koi8-r、cp1251等)。
  • 新增了 java.time.InstantSource 接口,允許在不參考時區的情況下進行時間操作。
  • 新增了 java.util.HexFormat API,用於轉換為十六進位表示形式,反之亦然。
  • 編譯器中新增了黑洞模式,可以停用死碼消除操作,可以在進行效能測試時使用。
  • 運行時新增“-Xlog:async”選項以非同步模式記錄日誌。
  • 建立安全連線時,預設啟用 TLS 1.3(之前使用 TLS 1.2)。
  • 先前聲明過時的 Applet API(java.applet.Applet*、javax.swing.JApplet)用於在瀏覽器中運行 Java 應用程序,現已移至預定刪除類別(支援結束後失去相關性)用於瀏覽器的Java 插件)。
  • 安全管理器早已失去了相關性,並且在瀏覽器插件支援結束後無人認領,已移至計劃刪除的類別。
  • RMI 啟動機制已被刪除,該機制已過時,屬於 Java 8 中的選項類別,並且在現代實踐中幾乎從未使用過。
  • 一個實驗性編譯器,支援 JIT(即時)為 HotSpot JVM 動態編譯 Java 程式碼,以及在啟動虛擬機之前將類別預期編譯(AOT,提前)為機器碼的模式,已從 SDK 中刪除。 該編譯器是用 Java 編寫的,基於 Graal 專案的工作。 值得注意的是,編譯器的維護需要大量的人力,在沒有開發人員需求的情況下這是不合理的。

來源: opennet.ru

添加評論