博客 / 詳情

返回

JDK23如約而至,數十種新玩法,你期待哪一種?

9 月 17 日,JDK23 它來了。

JDK23 並非長期支持版,下一個長期支持版是 JDK25,預計明年 9 月份發佈。

和鬆哥一起來看下這次的 JDK23 都有哪些新特性~

一 Language Previews

➜ 在 instanceof 和 switch 中 支持原始類型(預覽)

增強了模式匹配,擴展 instanceofswitch 以支持所有原始類型。這是一項預覽語言特性。

參見 JEP:455,https://openjdk.org/jeps/455

➜ 模塊導入聲明(預覽)

增強 Java 編程語言,使其能夠簡潔地導入模塊導出的所有包。這簡化了模塊庫的重用。這是一項預覽語言特性。

類似這樣去導入模塊:

import module java.base;
import module java.sql;

但是如果同一個模塊中出現了同名的類,那麼就必須恢復到之前的寫法,顯式導入了。

參見 JEP476,https://openjdk.org/jeps/476

➜ 靈活的構造函數體(第二次預覽)

在 Java 編程語言中的構造函數中,允許在顯式的構造函數調用之前出現語句,即 super(..)this(..) 之前允許出現其他代碼。這些語句不能引用正在構造的實例,但它們可以初始化類的屬性。在調用另一個構造函數之前初始化字段,這樣當方法被覆蓋時,可以使類更可靠。這是一項預覽語言特性。

鬆哥給大家舉一個使用場景,例如下面兩個類:

public class Animal {

    Animal() { overriddenMethod(); }

    void overriddenMethod() { System.out.println("hello"); }

}
public class Dog extends Animal {

    final Integer x;

    Dog(int x) {
        this.x = x;
        super();
    }

    @Override
    void overriddenMethod() { System.out.println(x.toString()); }

}

按照之前的寫法,上面這段代碼編譯會出錯。因為在 super() 之前出現了其他代碼。但是如果不在 super 之前初始化 x,那麼當初始化 Dog 的時候,就會出錯,因為初始化 Dog 會調用 Animal 的構造器,進而調用到 overriddenMethod 方法,而該方法在 Dog 中被重寫了,重寫後的方法用到了 x 這個變量...不過,以後這個問題就可以解決了。

參見 JEP482,https://openjdk.org/jeps/482

➜ 隱式聲明的類和實例主方法(第三次預覽)

以前我們寫 main 方法可能是這樣:

public class HelloWorld {

    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

以後可以寫成這個樣子了:

void main() {
    println("Hello, World!");
}

這裏連類都沒有了,隱式聲明類繼承自 Object,不實現接口,並且不能在源代碼中按名稱引用。此外,實例主方法也不再強制要求它們是 static 或 public 的,並且不帶參數的方法也可以作為有效的程序入口點。

參見 JEP477,https://openjdk.org/jeps/477

二 Libraries Previews

➜ 類文件 API(第二次預覽)

提供解析、生成和轉換 Java 類文件的標準 API。這是一項預覽 API。

參見 JEP466,https://openjdk.org/jeps/466

➜ 流收集器(第二次預覽)

增強 Stream API 以支持自定義中間操作,讓流操作更加靈活。這是一項預覽 API。

參見 JEP473,https://openjdk.org/jeps/473

➜ 結構化併發(第三次預覽)

通過引入結構化併發 API 簡化併發編程。結構化併發將不同線程中的相關任務組視為單個工作單元,從而簡化錯誤處理和取消,提高可靠性,並增強可觀察性。這是一項預覽 API。

參見 JEP480,https://openjdk.org/jeps/480

➜ 作用域值(第三次預覽)

引入作用域值,它使得方法能夠在線程內及其調用者之間共享不可變數據,以及與子線程共享。作用域值比線程局部變量更容易理解。當與虛擬線程(JEP 444)和結構化併發(JEP 480)一起使用時,它們還具有更低的空間和時間成本。這是一項預覽 API。

參見 JEP481,https://openjdk.org/jeps/481

➜ 向量 API(第八次孵化)

引入一種 API,用於表達在運行時可靠地編譯為受支持 CPU 架構上的最佳向量指令的向量計算,從而實現優於等效標量計算的性能。

參見 JEP469,https://openjdk.org/jeps/469

三 性能

可以在 Oracle JDK 中使用 Graal JIT

Oracle GraalVM JIT 編譯器(Graal JIT)現在作為 Oracle JDK 的一部分可用。這種集成為開發人員和系統管理員提供了更多選項,以幫助微調和提高應用程序的峯值性能。

不過這個特性需要手動啓用:

-XX:+UnlockExperimentalVMOptions -XX:+UseGraalJIT

如果在 JVM 啓動時不傳遞這些參數,則 Oracle JDK 的默認 JIT(C2)將照常運行。

➜ ZGC:默認的分代模式

將 Z 垃圾收集器 (ZGC) 的默認模式切換為分代模式。棄用非分代模式,計劃在未來的版本中將其移除。

參見 JEP474,https://openjdk.org/jeps/474

四 工具

➜ Markdown 文檔註釋

允許 JavaDoc 文檔註釋以 Markdown 而非僅 HTML 和 JavaDoc @ 標籤的混合形式編寫。

參見 JEP467,https://openjdk.org/jeps/467

五 管理

➜ 棄用 sun.misc.Unsafe 中的內存訪問方法

棄用 sun.misc.Unsafe 中的內存訪問方法以備在未來的版本中移除。這些不受支持的方法已被標準 API 取代,即 VarHandle API(JEP 193, JDK 9)和外部函數以及內存 API(JEP 454, JDK 22)。我們強烈鼓勵庫開發人員從 sun.misc.Unsafe 遷移到支持的替代品,以便應用程序可以順利遷移到現代 JDK 版本。

參見 JEP471,https://openjdk.org/jeps/471

六 撤回的 JEP

➜ 字符串模板

字符串模板首次在 JDK21 (JEP430) 中預覽,並在 JDK22 (JEP 459) 中再次預覽。經過反饋和廣泛討論,我們得出結論,該特性在當前形式下不適合。目前還沒有更好的設計共識,因此我們暫時撤回了該特性,JDK23 將不包含它。


七 重要更改和信息

javac 中默認禁用註解處理 ( JDK-8321314)

從 JDK23 開始,只有在顯式配置註解處理或在 javac 命令行上顯式請求運行註解處理時,才會運行註解處理。這和當前的默認行為不同,現有默認行為是在沒有顯式註解處理相關選項的情況下,通過搜索類路徑中的處理器來運行註解處理。

user avatar cicadasmile 頭像 iot_full_stack 頭像
2 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.