Java 23:新功能正式公佈

banq發表於2024-04-17

最新版本的 Java 開發工具包 23 (JDK) 在最新版本中具有四個新功能。到目前為止值得注意的兩個主要功能是 Vector API、Stream Gatherers 的第二個預覽以及模式中原始型別的預覽 - 例如instanceof和switch。

友情提醒,最新版本將於 9 月 19 日釋出。

Vector API
自Java Development Kit 16釋出以來, Vector API一直在Java的早期版本中孵化,一直到最新版本22。
這個新版本將引入一個API來幫助表達在執行時編譯的向量計算。

  • 是為了在不同支援的 CPU 架構上擁有最佳的向量指令。
  • 該提案的一些目標包括提供標準化 API、執行時編譯、在x64和AArch64CPU 架構上提供更好的效能、優雅降級、與平臺無關以及與 Valhalla 專案保持更多一致
  • 該專案旨在增強 Java 物件模型的值物件而是物件。

向量 API 程式碼示例

static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_PREFERRED;

void vectorComputation(float[] a, float[] b, float[] c) {
    int i = 0;
    int upperBound = SPECIES.loopBound(a.length);
    for (; i < upperBound; i += SPECIES.length()) {
        <font>// FloatVector va, vb, vc;<i>
        var va = FloatVector.fromArray(SPECIES, a, i);
        var vb = FloatVector.fromArray(SPECIES, b, i);
        var vc = va.mul(va)
                   .add(vb.mul(vb))
                   .neg();
        vc.intoArray(c, i);
    }
    for (; i < a.length; i++) {
        c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f;
    }
}

流收集器和流 API
如果您還記得,流收集器Stream Gatherers是 Java Development Kid 22 版本中預覽的一部分。現在它將完全新增到 JDK 23 中。

  • Stream Gatherers 將增強Stream API以支援自定義操作。
  • 它們還允許流管道以當前內建操作難以實現的方式幫助轉換資料。
  • 這樣做的目標是使流管道更加靈活和富有表現力——這也將允許自定義操作來操縱無限大小的流。

使用 類檔案 API 的目的是提供一個用於處理類檔案的 API:

  • 該 API 跟蹤 Java 虛擬機器規範定義的類檔案格式。
  • 這也意味著它將使 JDK 元件能夠遷移到標準 API,並刪除 Java 開發工具包的ASM 庫副本。

類檔案 API 新增了一些微調 :

  • 包括簡化類 CodeBuilder ,
  • 預設情況下包含位元組碼指令的工廠方法,包括低階工廠、中級工廠和基本塊的高階構建器。

下面是 ASM CodeBuilder 與 Java CodeBuilder 的一些示例程式碼。

ASM CodeBuilder 程式碼示例

ClassWriter classWriter = ...;
MethodVisitor mv = classWriter.visitMethod(0, <font>"fooBar", "(ZI)V", null, null);
mv.visitCode();
mv.visitVarInsn(ILOAD, 1);
Label label1 = new Label();
mv.visitJumpInsn(IFEQ, label1);
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ILOAD, 2);
mv.visitMethodInsn(INVOKEVIRTUAL,
"Foo", "foo", "(I)V", false);
Label label2 = new Label();
mv.visitJumpInsn(GOTO, label2);
mv.visitLabel(label1);
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ILOAD, 2);
mv.visitMethodInsn(INVOKEVIRTUAL,
"Foo", "bar", "(I)V", false);
mv.visitLabel(label2);
mv.visitInsn(RETURN);
mv.visitEnd();

Java CodeBuilder 示例程式碼

ClassBuilder classBuilder = ...;
classBuilder.withMethod(<font>"fooBar", MethodTypeDesc.of(CD_void, CD_boolean, CD_int), flags,
                        methodBuilder -> methodBuilder.withCode(codeBuilder -> {
    Label label1 = codeBuilder.newLabel();
    Label label2 = codeBuilder.newLabel();
    codeBuilder.iload(1)
        .ifeq(label1)
        .aload(0)
        .iload(2)
        .invokevirtual(ClassDesc.of(
"Foo"), "foo", MethodTypeDesc.of(CD_void, CD_int))
        .goto_(label2)
        .labelBinding(label1)
        .aload(0)
        .iload(2)
        .invokevirtual(ClassDesc.of(
"Foo"), "bar", MethodTypeDesc.of(CD_void, CD_int))
        .labelBinding(label2);
        .return_();
});

在 Java Development Kit 23 中,

  1. Java CodeBuilder 刪除了與低階方法重複的中級方法,或者更糟糕的是,不經常使用的中級方法。
  2. 同時您重新命名其餘的中級方法以提高可用性。
  3. 他們還完善了 ClassSignature 班級模型。這意味著它已得到改進,可以更準確地對superclasses和的通用簽名進行建模superinterfaces。

根據此功能背後的 OpenJDK 提案,Java 平臺應該定義和實現一個標準的類檔案 API,該 API 與類檔案格式一起發展,該格式可以輕鬆地更改或發展大約每六個月一次。

模式中的原始型別
正如前面提到的,隨著 Java Development Kit 23 的最新計劃功能和版本的釋出,我們獲得了另一個對於 Java 開發人員來說非常值得注意的預覽功能: primitive types in patterns, instanceof,  switch

此功能將透過允許:

  • 模式上下文中的原始型別模式來顯著增強模式匹配。
  • 然後我們擴充套件instanceof 和 switch 來處理所有原始型別。
  • 這還包括在巢狀和頂級上下文中使用原始型別模式的模式匹配: 提供易於使用的構造,消除由於不安全的強制轉換而丟失資訊的風險
  • 其他目標包括將模式型別與 對齊 instanceof、 instanceof 與安全轉換對齊以及
  • 允許 switch 處理任何原始型別的值。

原始型別Primitive Type程式碼案例:

switch (x.getStatus()) {
    case 0 -> <font>"okay";
    case 1 ->
"warning";
    case 2 ->
"error";
    case int i ->
"unknown status: " + i;
}

super(...) 之前的語句
Java 開發包 22 中預覽的其他功能也可以很容易地應用到 Java 開發包 23 中。

  • 其中包括 super(...) 之前的語句,這將為開發人員表達建構函式行為(即字串模板)提供更大的自由度。
  • 這將使表達包含執行時計算值(即作用域值)的字串變得更加容易。
  • 這樣就可以線上程內和執行緒間共享不可變資料,並隱式宣告類和例項主方法。

程式碼:
public class PositiveBigInteger extends BigInteger {

    public PositiveBigInteger(long value) {
        if (value <= 0)
            throw new IllegalArgumentException(<font>"non-positive value");
        super(value);
    }

}

總之,這些變化將使初學者更容易編寫程式,而無需瞭解為大型或企業應用程式開發而設計的程式語言功能。

甲骨文公司還透露了 2024 年的 Java 計劃。甲骨文公司概述了涉及OpenJDK專案的改進措施,從用於開發較小的、面向生產力的功能的Amber,到用於將Java擴充套件到GPU等國外程式設計模型的Babylon,再到用於用值物件增強Java物件模型以消除長期存在的效能瓶頸的Valhalla。

相關文章