Java 9 在2017年9月發佈,它不僅是Java 8之後一次重要的更新,更是帶來了許多深刻影響開發方式的變革,尤其是模塊化系統的引入。下面這個表格可以幫助你快速把握其核心特性概覽。

特性類別

核心亮點

主要價值

模塊化系統 (JPMS)

引入了模塊 (module) 概念,通過 module-info.java文件聲明依賴和暴露的包 。

實現強封裝、精細依賴管理、減小運行時體積 。

集合工廠方法

List, Set, Map提供了 of()靜態方法,快速創建不可變集合 。

創建簡潔安全,線程安全,性能更好 。

接口私有方法

允許在接口中使用 private關鍵字定義私有方法 。

提高接口內代碼複用性,減少冗餘 。

JShell (REPL)

提供交互式命令行工具,可直接輸入代碼片段並立即查看結果 。

快速測試代碼片段,學習語言特性 。

Stream API 增強

新增 takeWhile, dropWhile, iterate重載等方法 。

更精細控制流,簡化迭代操作 。

Optional 增強

新增 stream(), ifPresentOrElse(), or()等方法 。

更優雅處理可能為空對象 。

進程API增強

引入 ProcessHandle接口,提供查詢和控制本地進程的API 。

更強大管理操作系統進程 。

HTTP/2 客户端

提供新的標準化HTTP客户端,支持HTTP/2和WebSocket 。

替代老舊 HttpURLConnection,支持現代網絡協議 。

🔧 核心特性詳解

模塊化系統 (JPMS)

Java 平台模塊系統(JPMS,即 Project Jigsaw)是 Java 9 最具革命性的特性。它旨在解決傳統 JAR 文件在大型應用中面臨的類路徑混亂依賴隱式暴露JRE 臃腫等問題 。

模塊的核心是一個名為 module-info.java的描述文件,放在代碼根目錄下。它明確聲明瞭以下內容 :

  • requires: 聲明該模塊依賴哪些其他模塊。
  • exports: 聲明該模塊的哪些包可以被其他模塊訪問。未導出的包在模塊外部是不可見的,實現了強封裝
  • provides ... withuses: 用於聲明和服務提供者接口(SPI) 。

一個簡單的模塊定義示例如下:

// module-info.java
module com.mycompany.app {
    requires java.sql; // 聲明依賴
    exports com.mycompany.app.api; // 只暴露api包,其他包隱藏
}

通過模塊化,你可以使用 jlink工具創建一個只包含應用所需模塊的自定義運行時鏡像,顯著減小部署體積 。

集合工廠方法

Java 9 引入了創建不可變集合的簡便工廠方法,代碼更加簡潔 。

// 創建不可變列表
List<String> list = List.of("A", "B", "C");
// 創建不可變集合
Set<String> set = Set.of("A", "B", "C");
// 創建不可變映射
Map<String, Integer> map = Map.of("Key1", 1, "Key2", 2);
// 或者使用Map.ofEntries創建更多鍵值對
Map<String, Integer> map2 = Map.ofEntries(
    Map.entry("Key1", 1),
    Map.entry("Key2", 2)
);

這些方法創建的集合是不可變的,嘗試修改會拋出 UnsupportedOperationException。它們相比 Arrays.asList()更具線程安全性,且實現上可能更節省內存 。

接口私有方法

為了解決 Java 8 中接口的默認方法(default方法)可能產生的代碼重複問題,Java 9 允許在接口中定義私有方法 。

public interface MyInterface {
    default void methodA() {
        commonHelper();
        // ... 方法A的特有邏輯
    }
    
    default void methodB() {
        commonHelper();
        // ... 方法B的特有邏輯
    }
    
    // 私有幫助方法,被默認方法共享
    private void commonHelper() {
        // ... 公共邏輯
    }
    
    // 也支持私有靜態方法
    private static void staticHelper() {
        // ... 靜態公共邏輯
    }
}

JShell

JShell 提供了一個交互式環境,讓你無需先編寫類定義和 main方法就能快速測試代碼想法 。

$ jshell
|  歡迎使用 JShell -- 版本 9
|  要查看簡介,請鍵入:/help intro

jshell> int x = 10;
x ==> 10

jshell> String greeting = "Hello, JShell!";
greeting ==> "Hello, JShell!"

jshell> System.out.println(greeting + " x is: " + x);
Hello, JShell! x is: 10

jshell> /vars
|    int x = 10
|    String greeting = "Hello, JShell!"

你可以定義類、方法,導入包,以及使用 /list, /vars, /methods等命令查看狀態 。

Stream API 增強

  • takeWhile(Predicate)dropWhile(Predicate): 根據條件處理流。takeWhile會一直取元素直到條件第一次為 false,而 dropWhile會一直丟棄元素直到條件第一次為 false,然後返回剩餘元素 。
Stream.of(1, 2, 3, 4, 2, 1)
    .takeWhile(n -> n < 4) // 取出 1, 2, 3 (遇到4時停止)
    .forEach(System.out::println); 

Stream.of(1, 2, 3, 4, 2, 1)
    .dropWhile(n -> n < 4) // 丟棄 1, 2, 3,返回 4, 2, 1
    .forEach(System.out::println);
  • iterate重載: 新增的重載方法允許提供迭代終止條件,類似 for循環 。
// 生成一個從0開始,小於10的遞增數列
IntStream.iterate(0, n -> n < 10, n -> n + 1)
         .forEach(System.out::println);

Optional 增強

  • stream(): 將 Optional轉換為一個包含值(如果存在)的流,否則返回空流。這在需要將 OptionalStreamAPI 結合時非常有用 。
List<Optional<String>> list = Arrays.asList(
    Optional.of("A"), Optional.empty(), Optional.of("C"));

List<String> result = list.stream()
    .flatMap(Optional::stream) // 將每個Optional轉換為Stream
    .collect(Collectors.toList()); // 結果: ["A", "C"]
  • ifPresentOrElse(): 如果值存在,執行一個操作,否則執行另一個操作 。
optionalValue.ifPresentOrElse(
    value -> System.out.println("Found: " + value),
    () -> System.out.println("Not found")
);

⚙️ 其他重要更新

Java 9 還包括許多其他值得關注的改進:

  • 改進的 Try-With-Resources: 在 try-with-resources語句中,如果資源是 final或等效於 final的變量,可以直接使用,無需在語句內聲明新變量,使代碼更簡潔 。
// Java 9 之前
BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
try (BufferedReader r = reader) { ... }

// Java 9 及以後
BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
try (reader) { ... } // 直接使用已存在的變量
  • 多版本兼容 JAR 包 (Multi-Release JARs): 允許為不同的 Java 版本提供不同的類文件。例如,一個 JAR 包可以同時包含面向 Java 8 和 Java 9 的類實現,從而在保持向後兼容的同時利用新版本特性 。
  • HTTP/2 客户端 (標準): 引入了新的 HTTP 客户端 API (java.net.http包),支持 HTTP/2 和 WebSocket,旨在替代舊的 HttpURLConnection。它支持同步和異步調用 。
  • 響應式流 (Reactive Streams) API: 在 java.util.concurrent.Flow類中引入了響應式流規範的接口(Publisher, Subscriber, Subscription, Processor),為 Java 平台提供了標準的非阻塞背壓異步流處理基礎 。

🚀 總結與建議

Java 9 的模塊化系統(JPMS)是其最核心的變革,為構建更安全、更健壯和更易維護的大型應用奠定了基礎。而集合工廠方法、接口私有方法、JShell 等特性則從不同層面提升了開發效率和代碼質量 。

儘管 Java 9 本身已結束公開更新,但其引入的許多特性,尤其是模塊化思想,深刻影響了後續 Java 的發展。理解這些特性,特別是模塊化,對於理解現代 Java 應用架構至關重要。

希望這份詳細的介紹能幫助你全面瞭解 Java 9 的新特性。