Java 16正式发布 Java 16有哪些新特性

Java 16正式发布 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");
    }        
}

分享到 :
相关推荐

Leave a Reply

Your email address will not be published. Required fields are marked *