Java 18 正式發布:附帶簡易 HTTP 伺服器,棄用 Finalization

infoq 發佈 2022-04-16T07:26:14.643247+00:00

目前,Java 19 中只有一個 Targeted 或 Integrated 狀態的 JEP:JEP 422:Linux/RISC-V移植。

甲骨文(Oracle)發布了 Java 程式語言和虛擬機的第 18 版。該版本的最終特性主要集中在以下 9 個 JEP 上:


  • JEP 400:默認字符集為UTF-8
  • JEP 408:簡易Web伺服器
  • JEP 413:支持在Java API文檔中加入代碼片段
  • JEP 416:用方法句柄重新實現核心反射
  • JEP 417:Vector API(第三個孵化階段)
  • JEP 418:網絡地址解析SPI
  • JEP 419:外部函數&內存API(第二個孵化階段)
  • JEP 420:Switch的模式匹配(第二版預覽)
  • JEP 421:棄用Finalization以備後繼刪除


Java 18 的特性節奏略低於之前的版本:Java17 中包含 14 個特性;Java 16 中包含 17 個特性;Java 15 中包含 14 個特性;Java 14 中包含 16 個特性。


這個版本的 JEP 特性為Amber項目、Loom項目和Panama項目提供了持續的貢獻,並提供了一些有用的新工具。本文介紹其中的一些新特性。

Panama 項目

JEP 417 和 JEP 419 由 Panama 項目贊助,該項目旨在改進和豐富 JVM 與定義良好的「外部」(即非 Java)API 之間的互操作性,這些 API 很可能會包括 C 語言庫中常用的接口。


除了性能的改進之外,JEP 417,Vector API(第三個孵化階段)還針對前兩個孵化階段的反饋進行了增強:JEP 414,Vector API(第二個孵化階段)和 JEP 338,Vector API(孵化階段)。JEP 338 作為孵化階段模塊集成在 JDK 16 中,JEP 414 被定義為JDK 17的最終 JEP 之一。


JEP 419,外部函數和內存API(第二個孵化階段)根據 Java 社區的反饋(JEP 412,外部函數和內存API(孵化階段),該 JEP 在 JDK 17 中交付)進行了改進。第二個孵化階段的變化包括:在內存訪問 var 句柄中支持更多載體,如 booleanMemoryAddress 接口;用於 MemoryAddressMemorySegment 接口的更通用的解引用(dereference)API;更方便獲取下行調用(downcall)方法句柄的 API,這樣就不再需要傳遞 MemoryType 枚舉了;以及新的用於內存段之間複製 Java 數組的 API。

Loom 項目

JEP 418 由 Loom 項目贊助,該項目旨在探索、孵化並交付 Java 虛擬機(JVM)特性和 API,以支持易於使用、高吞吐量的新型輕量級並發編程模型。這將通過虛擬線程、定界延續(delimited continuations)和尾調用來實現。


JEP 418,網絡地址解析SPI,為主機名和地址解析定義了一個服務提供者接口,以便 java.net.InetAddress 可以利用默認的內置 OpenJDK 解析器以外的解析器。

Amber 項目

JEP 420 由 Amber 項目贊助,該項目旨在探索和孵化更小的 Java 語言特性,以提高生產率。


JEP 420,Switch的模式匹配(第二版預覽),允許針對多個模式測試目標 switch 表達式,每個模式都有一個特定的操作,從而可以簡潔而安全地表達複雜的面向數據的查詢。這是繼在 JDK 17 中交付的 JEP 406,Switch的模式匹配(預覽版)之後的第二個預覽版本。增強功能包括:對支配性檢查(dominance checking)的改進,強制在同一類型的受保護模式之前出現一個常量的 case 標籤;與密封的層次結構相比,現在對switch塊的檢查更加精確了。

Java 工具

JEP 413,支持在Java API文檔中加入代碼片段,為 Oracle 的標準Doclet引入了 @snippet 標記,這是一個眾所周知的 Java API 文檔實用程序,可生成默認的 HTML 格式的輸出。其目的是簡化 API 文檔中包含的示例原始碼。代碼片段可以是內聯的,也可以是外部的,下面的這兩個示例將會說明這一點:


在如下內聯的示例中,原始碼被添加到@snippet標記前面的注釋中,並用大括號括起來了:


/**
 * 下面的代碼展示了如何使用 {@code Optional.isPresent}:
 * {@snippet :
 * if (v.isPresent()) {
 *     System.out.println("v: " + v.get());
 *     }
 * }
 */

複製代碼


在如下外部的示例中,現有的源文件 ShowOptional.java 包含了 @start@end 標記。已定義的區域,即 region="example" ,在注釋和源文件中被引用:


/**
 * 下面的代碼展示了如何使用 {@code Optional.isPresent}:
 * {@snippet file="ShowOptional.java" region="example"}
 */
public class ShowOptional {
    void show(Optional<String> v) {
        // @start region="example"
        if (v.isPresent()) {
            System.out.println("v: " + v.get());
            }
        // @end
        }
    }

複製代碼


JEP 408,簡單Web伺服器,提供了一個簡易的 HTTP 命令行 Web 伺服器,它只提供靜態文件。 該實用程序旨在用於原型設計、臨時編碼和測試,特別是在教育場景中。 伺服器啟動方式如下:


java -m jdk.httpserver [-b bind address] [-p port] [-d directory] [-h to show help message] [-o none|default|verbose]

複製代碼

Java 19

目前,Java 19 中只有一個 TargetedIntegrated 狀態的 JEP:


  • JEP 422:Linux/RISC-V移植


Java 19 的正式發布日期尚未公布,但按照 6 個月的發布周期推算,預計將於 2022 年 9 月中旬發布。開發人員預計會在 2022 年 6 月中旬進行特性凍結。


Java 18 現在可以從Oracle下載了,其他供應商的二進位文件預計在幾天後提供。


原文連結:


https://www.infoq.com/news/2022/03/java18-released/

關鍵字: