Java SE 15 新增特性
Java SE 15 新增特性
作者:Grey
原文地址:Java SE 15 新增特性
源碼
鏡像倉庫: 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 沒有提供對繼承的細粒度控制。訪問修飾符,如public
、protected
、private
,以及默認的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。
任何繼承密封類的類本身必須被聲明為final
、non-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。隱藏類則沒有這種依賴性。
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