官方正式釋出 Java 16

Mr_ηobody發表於2021-03-17

前言

就在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安裝包和官方指導文件。

相關文章