Java SE 15 新增特性

Java SE 15 新增特性

作者:Grey

原文地址:Java SE 15 新增特性

源碼

源倉庫: Github:java_new_features

鏡像倉庫: GitCode:java_new_features

ZGC

Java SE 11 JEP 333將 ZGC 垃圾收集器作為一項實驗性功能引入。

這個 JEP 377 修復了一些錯誤,增加了一些功能和改進,現在支援 Linux/x86_64 、Linux/aarch64、Windows 和 macOS 等主要平台。
這個JEP 377還將 ZGC 從一個實驗性功能變為一個產品功能。然而,默認的垃圾收集器仍然是 G1。

下面的命令啟用了 ZGC 垃圾收集器

java -XX:+UseZGC className

文本塊正式啟用

多行字元串或文本塊經歷了

Java 12 JEP 326 Raw String Literals

Java 13 JEP 355: Text Blocks (Preview)

Java 14 JEP 368: Text Blocks (Second Preview)

是 Java SE 15 中的一個正式啟用的功能,見JEP 378: Text Blocks

示例程式碼如下

package git.snippets.jdk15;

/**
 * text block正式啟用
 * @author <a href="mailto:[email protected]">Grey</a>
 * @date 2021/11/29
 * @since 15
 */
public class BlockTestInJava15 {
    public static void main(String[] args) {
        String content = """
                {
                    "hello": 1,\
                    "world": 2,
                    "hello world": "1\s2",
                }
                 """;
        System.out.println(content);
        String java15 = """
                <html>
                    <body>
                        <p>Hello, World</p>
                    </body>
                </html>
                """;
        System.out.println(java15);
    }
}

運行結果


{
    "hello": 1,    "world": 2,
    "hello world": "1 2",
}

<html>
    <body>
        <p>Hello, World</p>
    </body>
</html>

Sealed Classes

目前,Java 沒有提供對繼承的細粒度控制。訪問修飾符,如publicprotectedprivate,以及默認的package-private,提供了非常粗略的控制。

Sealed Classes 的目標是允許單個類聲明哪些類型可以作為子類型使用。這也適用於介面和確定哪些類型可以實現它們, 其中

sealed — 意味著它們必須使用 permits 關鍵字定義哪些類允許繼承自它。

non-sealed — 允許任何類能夠繼承於它。

密封類涉及兩個新的關鍵字 — sealed 和 permits,如下示例

package git.snippets.jdk15;

/**
 * @author <a href="mailto:[email protected]">Grey</a>
 * @date 2022/8/21
 * @since 15
 */
public abstract sealed class Person permits Employee, Manager {

    //...
}
final class Employee extends Person {
}

non-sealed class Manager extends Person {
}

我們已經聲明了一個名為 Person 的抽象類。我們還規定,能夠擴展它的類只有 Employee 和 Manager。

任何繼承密封類的類本身必須被聲明為finalnon-sealed的或sealed的。這可以確保類的層次結構保持在有限的範圍內被編譯器識別。

這種有限的、詳盡的層次結構是使用密封類的一大好處。讓我們看看這個例子的實際應用。如下程式碼

if (person instanceof Employee) {
    return ((Employee) person).getEmployeeId();
} 
else if (person instanceof Manager) {
    return ((Manager) person).getSupervisorId();
}

如果沒有一個密封的類,編譯器就不能合理地確定所有可能的子類都被我們的 if-else 語句所覆蓋。如果末尾沒有 else 子句,編譯器可能會發出警告,表明我們的邏輯沒有涵蓋所有的情況。

Sealed Classes 在 Java SE 15 中是預覽功能,到 Java SE 17 中正式啟用。

創建隱藏類

Java SE 15中引入的一個新特性被稱為隱藏類。雖然大多數開發者不會發現它們的直接好處,但任何使用動態位元組碼或 JVM 語言的人都可能會發現它們很有用。

隱藏類的目標是允許在運行時創建不能被發現的類。這意味著它們不能被其他類鏈接,也不能通過反射被發現。像這樣的類通常有一個很短的生命周期,因此,隱藏類被設計成在載入和卸載時都很高效。

請注意,當前版本的 Java 確實允許創建類似於隱藏類的匿名類。然而,它們依賴於不安全的API。隱藏類則沒有這種依賴性。

詳見:JEP 371: Hidden Classes

instanceof 類型匹配 (二次預覽)

instanceof 類型匹配功能在 Java SE 14 中進行了預覽,Java SE 15 旨在繼續其預覽狀態,沒有新的增強功能。

該功能的目標是刪除大量通常由 instanceof 操作符帶來的模板程式碼。

在 Java SE 14 之前

        // Before Java 14:
        if (obj instanceof H) {
            H jd1 = (H) obj;
            jd1.setId(1);
        }

在 Java SE 14 中,可以簡化為

        // Java 14+
        if (obj instanceof H jd2) {
            jd2.setId(1);
        }

Records(二次預覽)

Records 是存儲純數據的數據類。使用 Records 是為了快速創建簡單而簡潔的類(不含模板程式碼)。

Records 最初在 Java SE 14 中作為早期預覽版推出,Java SE 15 旨在繼續其預覽狀態,在 Java SE 16 中正式發布。

移除 Nashorn JavaScript 引擎

Nashorn JavaScript 引擎在 Java 8 中被引入,在 Java 11 中被標記為廢棄。由於 ECMAScript 語言發展很快,維護 Nashorn JavaScript 的成本過於高昂,在 Java 15 中被徹底刪除。

詳見:JEP 372: Remove the Nashorn JavaScript Engine

更多

Java SE 7及以後各版本新增特性

參考資料

JDK 15 Release Notes

Java 新特性教程

What』s New in Java 15

What is new in Java 15