官方正式發佈 Java 16

前言

就在2021/03/16,官方正式發佈了Java 16。我們可以下載使用Java 16了。
在這裡插入圖片描述

特性

向量API(孵化)

在運行期,Vector 表示向量計算可以可靠地編譯成支持CPU架構上的最佳矢量硬件指令,從而實現優於等效標量計算的性能。提升了Java在CPU向量計算的性能。

啟用c++ 14 語言特性

允許在JDK中C++源代碼中使用 C ++ 14的新特性,並給出哪些特性可能在熱點代碼中使用的具體指導。

從Mercurial遷移到Git

將OpenJDK社區的源代碼庫從Mercurial (hg)遷移到Git。

遷移到GitHub

在GitHub上託管OpenJDK社區的Git倉庫。與JEP 357(從Mercurial遷移到Git)一起,這將把所有存儲庫OpenJDK項目遷移到GitHub上,包括JDK特性版本和版本11及以後的JDK更新版本。

ZGC 並發線程堆棧處理

將ZGC線程堆棧處理從安全點移動到並發階段。

Unix-Domain 套接字通道

在java.nio.channels包中,為socket channel和server-socket channel api增加Unix-domain(AF_UNIX)套接字支持。

Alpine Linux Port

在x64和AArch64架構上,將JDK移植到Alpine Linux和其他使用musl作為主要C庫的Linux發行版上。

Elastic Metaspace

更及時地將未使用的熱點類元數據(即metaspace元空間)內存返回給操作系統,減少元空間的佔用,並簡化元空間代碼,以減少維護成本。

Windows/AArch64 Port

將 JDK 移植到 Windows / AArch64。隨着新的消費者級和服務器級AArch64 (ARM64)硬件的發佈,Windows/AArch64已經成為終端用戶需求的一個重要平台。

Foreign Linker API(孵化)

引入一個API,該API提供對本機代碼的靜態類型純java訪問。這個API,與外部內存API (JEP 393),能極大簡化綁定到本機庫的容易出錯的過程。

基於值的類的警告

將原始包裝類指定為基於值的類,並棄用它們的構造函數以便刪除,並提示新的棄用警告。提供關於在Java平台中任何基於值類的實例上進行同步的警告。

打包工具

提供jpackage工具,用於打包自包含的Java應用程序。

外部內存訪問API(第三次孵化)

引入一個API,允許Java程序安全有效地訪問Java堆之外的外部內存。

為instanceof進行模式匹配

使用對instanceof操作符的模式匹配來增強Java編程語言。模式匹配允許程序中的公共邏輯,即從對象中有條件地提取組件,以更簡潔和更安全的方式表達。

以前我們使用是這樣的,先判斷類型,再強制轉換。

if (obj instanceof String) {
    String s = (String) obj; 
    ...
}

Java 16中,可以這樣使用了,直接使用遍歷s。

if (obj instanceof String s) {
    // 可以直接使用s
    ...
}

還可以這樣使用,但是前提是第一個判斷成立,第二個才能正確執行,所以可以使用&&,不能使用||。

if (obj instanceof String s && s.length() > 5) {
    flag = s.contains("jdk");
}

Records

用Records關鍵字增強Java編程語言,Records作為不可變數據透明載體的類。

以前我們定義一個類是這樣的,如下:

class Point {
    private final int x;
    private final int y;

    Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    int x() { return x; }
    int y() { return y; }

    public boolean equals(Object o) {
        if (!(o instanceof Point)) return false;
        Point other = (Point) o;
        return other.x == x && other.y == y;
    }

    public int hashCode() {
        return Objects.hash(x, y);
    }

    public String toString() {
        return String.format("Point[x=%d, y=%d]", x, y);
    }
}

在Java 16中,只需要簡潔的如下定義:

record Point(int x, int y) { }

默認情況下對JDK內部進行強封裝

默認情況下,強烈封裝JDK的所有內部元素,除了關鍵的內部api,如sun.misc.Unsafe。允許最終用戶選擇寬鬆的強封裝,這是自JDK 9以來的默認封裝。提高了JDK的安全性和可維護性。

Sealed Classes

使用密封的類和接口增強Java編程語言。密封的類和接口限制了其他類或接口可以擴展或實現它們。

public abstract sealed class SealedHuman permits Student, Teacher {
    protected final String name;
    public abstract void speak();
    public SealedHuman(String name) {
        this.name = name;
    }
}

public final class Student extends SealedHuman {
    public Student(String name) {
        super(name);
    }
    
    public void speak() {
        System.out.println("student name:" + name);
    }
    
    public void study() {
        System.out.println(name +" is studying");
    }
}

public final class Teacher extends SealedHuman {
    public Teacher(String name) {
        super(name);
    }
    
    public void speak() {
        System.out.println("Teacher name:" + name);
    }        

    public void teach() {
        System.out.println(name +"is teache");
    }        
}

提前嘗試Java 16新特性,關注如下公眾號,添加作者獲取Java 16安裝包和官方指導文檔。