1. 人人编程首页
  2. 编程语言
  3. Java

Java 14新特性介绍

Java 14于2020年3月17日全面发布。在JDK14中新增了以下16个新特性:

  • 305: instanceof的模式匹配 (预览)
  • 343: 打包工具 (Incubator)
  • 345: G1的NUMA内存分配优化
  • 349: JFR事件流
  • 352: 非原子性的字节缓冲区映射
  • 358: 友好的空指针异常
  • 359: Records (预览)
  • 361: Switch表达式 (标准)
  • 362: 弃用Solaris和SPARC端口
  • 363: 移除CMS(Concurrent Mark Sweep)垃圾收集器
  • 364: macOS系统上的ZGC
  • 365: Windows系统上的ZGC
  • 366: 弃用ParallelScavenge + SerialOld GC组合
  • 367: 移除Pack200 Tools和API
  • 368: 文本块 (第二个预览版)
  • 370: 外部存储器API (Incubator)

通过上述新特性,我们可以看出其中363、364、365、366都是关于垃圾回收器的。其中363已经明确弃用CMS垃圾收集器。而其中针对开发过程中可见的特性包括:instanceof模式匹配、Switch表达式、文本块等。下面我们就来体验一下编程过程中能用到语法形式。

1.instanceof的模式匹配(预览)

Object obj = "java14";
//测试
if (obj instanceof String sss && sss.length() > 5) {
    System.out.println(sss.contains("b"));
    System.out.println("这是字符串!sss" + sss);
} else {
    System.out.println("其他~");
}

在 instanceof 后面直接可以转换类型, 不用再将Object转成String,言简意赅。

2.文本块(第二预览)

在Java中,文本块是多行字符串文字。这意味着我们不需要陷入混乱的显式行终止符,字符串连接以及分隔符的情况,而这些分隔符通常用于编写普通的字符串文字。文本块包含多行文本,并使用三个双引号字符(”””)作为其开始和结束定界符。

由文本块生成的实例的类型java.lang.String与传统的双引号字符串相同。这包括对象表示和插入字符串池。
同样,可以在使用字符串文字的任何地方使用文本块。例如,我们可以将其用于字符串连接。

String string = "Hello";
String textBlock = """
                    World""";

String joinedString =  string + textBlock;

System.out.println(joinedString);

3.有用的NullPointerExceptions

以前的空指针只会定位到一行(生产环境让人抓狂),现在可以定位到具体的哪一个对象为null。
注意:调试时候需要加参数: -XX:+ShowCodeDetailsInExceptionMessages

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)

4.Records (预览)

record type已在Java 14中作为预览功能引入,并且将用作在类和应用程序之间进行数据传输的普通不可变数据类。
像enum一样,record也是Java中的一种特殊的类类型。它旨在用于仅创建类以充当纯数据载体的地方。

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

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

}

5.Switch表达式 (标准)

在Java 14中,使用switch表达式,整个switch块“获取一个值”,然后可以在同一语句中将其分配给变量。
它支持多个大小写标签,并yield用于代替旧return关键字返回值。如果是enum,我们可以跳过这种default情况。如果存在某些情况下无法处理的缺失值,编译器将进行投诉。在所有其他表达式类型(int,字符串等)中,我们还必须提供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;
}

6.更多功能

当然,java14还有许多其他特性的优化,比如垃圾回收器的ParallelScavenge + SerialOld的弃用等。但在使用之前,还是需要慎重,毕竟很多特性都只是作为预览特性出现。

本文来自转载,原文链接:

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注