Java 14即将发布,正式加入新的Switch表达式

依照6个月的发布周期,甲骨文预计在3月17日时发布Java 14,这个版本有三个主要的更新,第一个便是在Java 12添加的预览功能Switch表达式,在Java 14中成熟成为正式功能,第二个则是添加的语言功能,为instanceof增加模式配对,第三个则是JVM的功能,提供有用的NullPointerExceptions消息。

由于Java旧的Switch表达式有几个问题,因此官方在Java 12的时候,加入新的Switch表达式语法预览版,要让Switch更好用。Switch表达式语法包含case以及break陈述式,条件配对由上往下执行,一旦进到特定case中,break陈述式会确保下一个case区块不会被执行,但是当开发者忘记写break,执行流程会继续往下走,直到碰到下一个break,这个现象被称为贯穿(Fall-through)。

而在新的Switch表达式中,使用了新的语法来避免贯穿发生的可能性,因此能够降低可能产生bug的几率。新的Switch格式使用Lambda风格的语法,该语法由标签和回传值程序代码间的箭头组成,但官方强调,这个并非真正的Lambda表达式,只是类似而已。

Java 12之前,Switch表达式中每一个case只能使用一个标签,因此尽管不同标签的处理逻辑相同,仍需要分开写成两个case区块,或是故意利用贯穿现象来完成目的,但是故意使用贯穿可能会造成误解,因为在部分情况会难以判断缺少break陈述式是故意的还是无意的。而在新的Switch表达式中,现在可以在case使用多个标签处理这样的情况。

官方表示,新的Switch表达式也更加详尽安全,当开发者在Switch中使用enum时,编译器会检查case是否枚举所有enum中的值,当创建的switch没有涵盖所有的值,则会出现编译器错误,这个错误可以提醒开发者处理遗漏的情况。

另外,Switch在Java 12之前只是一个陈述式,而现在则可作为一个表达式使用。官方提到,陈述式的本质是动作,而表达式的本质则是请求产生一个值,表达式越基本容易理解,也会使得程序代码更容易维护。而现在开发者可以把switch撰写成简洁的表达式,以更好地表明程序代码的意图。

Java 14为instanceof加入模式配对,这个功能可减少有条件instanceof检查,进行强制转换的需要。模式配对是让开发者能够测试值的样子,并在符合特定规则的时候截取出信息,在测试参数以确定其类型时,会经过转换,并声明区域变量,以便后续利用特定类型进行处理。

这个新的语言功能,则是让开发者从对象中有条件地取出组件变得简单,使语法更加简单可读,官方表示,这个预览功能为广泛的模式配对开了一个门,模式配对的中心思想,就是要提供一个功能,可以简单地根据条件,从对象中截取出组件,而instanceof运算符就是这样的功能。

Java 14加入新的JVM功能,让开发者可以获取更多可用于诊断错误的消息,在Java 14之前,NullPointerException消息含糊不清,无法明确的让开发者知道程序问题所在,而现在,消息至少会包含问题发生的位置以及原因两类信息。这项功能不止可用于方法调用,还可用于其他可能导致NullPointerException的地方,包括字段访问、数组访问和赋值。