JDK 14 必须知道的几个新特性。

JDK 14 在上个月已经发布,在众多新特性中,有几个比较重要和实用的特性,我们有必要了解一下,下面一一讲解。

JDK 14 请点击这里下载:jdk-14.0.1_windows-x64_bin.exe官方镜像版

1、instanceof的模式匹配:

Instanceof是java中用于检查对象引用是否为给定Type类型的实例,并返回布尔值。在Java 14之前,我们在完成判断之后,经常需要做一下类型的强制转换,如下:

if (obj instanceof String) {
    String nowJava = (String) obj;
    System.out.println(nowJava);
}

上述示例中,为了能够安全地将obj转为我们期望的String类型,需要通过instanceof运算符对obj进行类型判断。这里发生了三件事:

  • 测试obj是否是一个String。
  • 将obj转换为String。
  • 声明新的局部变量s,以便我们可以使用字符串值。

这种模式很简单,并且所有Java程序员都可以理解,但代码有点啰嗦,看在JDK 14中的简单写:

if (obj instanceof String nowJava) {
    System.out.println(nowJava);
}

这样是不是就简练多了。

2、异常提示更友好

NullPointerException 是Java开发中经常会遇到的异常。在JDK 14之前的版本中,NullPointerException 异常的消息只是简单的null,并不会告诉你任何有用的信息,只能根据异常产生的源文件的行号来查找。对于很长的引用链来说,很难定位到底是哪个对象为null。比如,类似a.b.c.d这样的引用方式,a、b和c中的任何一个为null,都会出现 NullPointerException 异常。仅靠行号无法快速定位问题所在。

在下面的代码中,对b.a.doSomething()的调用会出现 NullPointerException 异常。

public class NPE {
  private static class A {
    void doSomething() {}
  }

  private static class B {
    A a;
  }

  public static void main(String[] args) {
    B b = new B();
    b.a.doSomething();
  }
}

直接运行该文件的错误信息如下所示,从中我们只可以知道错误出现在14行。
Exception in thread "main" java.lang.NullPointerException at io.vividcode.javafeatures.NPE.main(NPE.java:14)

增强了对NullPointerException异常的处理,可以显示更详细的信息:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "io.vividcode.javafeatures.NPE$A.doSomething()" because "<local1>.a" is null at io.vividcode.javafeatures.NPE.main(NPE.java:14)

3、Switch 表达式更简捷

在JDK 14中Switch表达式变化包括如下几个内容:
可以使用箭头标签进行匹配。当箭头标签匹配时,只有对应的语句或表达式会执行,没有fall-through。下面代码中的printDays()方法使用箭头标签匹配days的值。不允许fall-through可以避免很多潜在的问题。

void printDays(int days) {
  switch (days) {
    case 0 -> System.out.println("None");
    case 1 -> System.out.println("1 day");
    default -> System.out.println(days + " days");
  }
}

还可以:

var returnString = switch (event) {
    case PLAY -> System.out.println("User has triggered the play button");
    case STOP, PAUSE -> System.out.println("User needs a break");
    default -> {
        String message = event.toString();
        LocalDateTime now = LocalDateTime.now();
        System.out.println("Unknown event " + message + " logged on " + now);
    }
};

4、好用的文本块功能

Java语言增加文本块功能。文本块是多行字符串文字,能避免大多数转义。
我们通常是这样做的:

展开阅读全文

本文系作者在时代Java发表,未经许可,不得转载。

如有侵权,请联系nowjava@qq.com删除。

编辑于

关注时代Java

关注时代Java