Java14 - 新功能

Java14 - 新功能 首页 / Java入门教程 / Java14 - 新功能

Java 14已于2020年3月17日全面上市。在本文中,无涯教程将介绍Java编程语言中添加的几个新函数列表中的一些函数。

可以在此处找到 JDK 14 Releases

Instanceof匹配

在Java 14中,已将instanceof运算符修改为具有类型测试模式。类型测试模式(instanceo中使用)由指定类型及单个绑定变量组成。

在下面的代码中,短语String s是类型测试模式:

if (obj instanceof String s) {
   //can use s here
} else {
   //can't use s here
}

在上面的示例中,如果obj String 的实例,则instanceof运算符会将目标obj匹配到类型测试模式。然后将其强制转换为String,并分配给绑定变量s

请注意,如果obj不为空,则仅匹配模式,并且仅分配s

文本块

在Java中,文本块是多行字符串文字。这意味着无涯教程不需要陷入显式的行终止符,字符串连接以及分隔符的混乱局面,而这些分隔符通常用于编写普通的字符串文字。

文本块包含多行文本,并使用三个双引号字符(""" )作为其开始和结束定界符。

从文本块生成的实例的类型为java.lang.String,其特征与传统的双引号字符串相同。这包括对象表示和插入字符串池

同样,可以在可以使用字符串文字的任何地方使用文本块。例如可以将其用于字符串连接。

String string = "Hello";
String textBlock = """
                    World""";
 
String joinedString =  string + textBlock;
 
System.out.println(joinedString);

空指针异常

Java 14通过精确描述哪个变量为null来提高JVM生成的NullPointerException的可用性。

首先,需要传递 -XX:+ ShowCodeDetailsInExceptionMessages JVM标志以在运行应用程序时启用此函数。确保您通过了它。

public class HelpfulNullPointerException 
{
    public static void main(String[] args) 
    {
        Employee e = null;
         
        System.out.println(e.getName());
    }
}
Exception in thread "main" java.lang.NullPointerException: 
    Cannot invoke "com.howtodoinjava.core.basic.Employee.getName()" because "e" is null
    at com.howtodoinjava.core.basic.HelpfulNullPointerException.main 
    (HelpfulNullPointerException.java:9)

只有由JVM直接创建并抛出的NPE才会包含空细节消息(通常在程序中创建异常时在构造函数中传递的消息)。

Record类型

record类型已在Java 14中作为预览函数引入,并且将用作在类和应用程序之间进行数据传输的普通不可变数据类。

enum一样,record也是Java中的一种特殊的类类型。它旨在用于仅创建类以充当纯数据载体的地方。

class和record之间的重要区别在于,Record记录旨在消除设置和从实例获取数据所需的所有代码。Record将这种责任转移到java编译器,该编译器生成构造函数,字段getter,hashCode()和equals()以及toString()方法。

public record EmployeeRecord(Long id, 
        String firstName, 
        String lastName, 
        String email, 
        int age) {
     
}

Switch表达式

switch语句允许应用程序在运行时基于给定表达式的值具有多个可能的执行路径。

在Java 14中,使用 switch表达式,整个switch块"获取一个值",然后可以在同一语句中将其分配给变量。

它支持多个大小写标签,并使用yield返回值代替旧的return关键字。

如果是enum,可以跳过default情况。在所有其他表达式类型(int,string等)中,还必须提供default大小写。

public static Boolean isWeekDay (Day day) 
{
    Boolean result = switch(day) {
        case MON, TUE, WED, THUR, FRI ->
        { 
            System.out.println("It is WeekDay");
            yield true; 
        }
        case SAT, SUN ->
        { 
            System.out.println("It is Weekend");
            yield false; 
        }
    };
    return result;
}

Packaging Tool (Incubator)

使用JDK 8,作为JavaFX套件的一部分发布了名为javapackager的工具。但是,随着JDK 11发行版从JavaFX分离JavaFX之后,javapackager不再可用。

该JEP基于javapackager工具创建了一个简单的打包工具,该工具支持本地打包格式,从而为最终用户提供自然的安装体验。这些格式包括Windows上的msi和exe,macOS上的pkg和dmg以及Linux上的deb和rpm。

可以从命令行直接调用该工具,也可以通过 ToolProvider API 以编程方式调用该工具。

$ jpackage --name myapp --input lib --main-jar main.jar

 G1 的 NUMA 内存分配

在Numa(非统一内存访问)内存体系结构中,每个处理器内核都接收少量的本地内存,但其他内核则被授予对其的访问权限。

-XX:+ UseParallelGC 启用的并行垃圾收集器已经意识到NUMA多年,并提高了跨多个套接字运行单个JVM的配置的性能。

通过此JEP,G1垃圾收集器得到了增强,可以在Linux OS下更好地进行内存管理。

JFR 事件流

该JEP公开了JDK Flight Recorder数据以进行连续监控,无论是针对流程内还是流程外的应用程序。

要今天使用数据,用户必须开始记录,停止记录,将内容转储到磁盘,然后解析记录文件。这对于应用程序概要分析非常有效,其中通常一次记录至少一分钟的数据,但不适用于监视目的。

模块 jdk.jfr 中的软件包 jdk.jfr.consumer 已扩展,具有异步订阅事件的函数。用户可以直接从磁盘存储库中读取或流式传输记录数据,而无需转储记录文件。

Non-Volatile Mapped Byte Buffers

该JEP添加了新的特定于JDK的文件映射模式,以便可以使用 FileChannel API创建引用NVM的 MappedByteBuffer 实例。 NVM也称为持久性内存,用于永久存储数据。

MappedByteBufer API的最新更改意味着,它支持允许直接内存更新的所有行为,并提供了更高级别的Java客户端库实现持久性数据类型(例如,块文件系统,日志日志,持久性对象等)。

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

微服务架构实战160讲 -〔杨波〕

数据结构与算法之美 -〔王争〕

白话法律42讲 -〔周甲徳〕

RPC实战与核心原理 -〔何小锋〕

职场求生攻略 -〔臧萌〕

大厂晋升指南 -〔李运华〕

etcd实战课 -〔唐聪〕

说透芯片 -〔邵巍〕

Serverless进阶实战课 -〔静远〕

好记忆不如烂笔头。留下您的足迹吧 :)