您现在的位置是:首页 > 文章详情

【开发】 Java 14 今天正式发布了!

日期:2020-03-18点击:443

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!

Java 14今天正式发布了。那么,14版究竟有什么新功能,对于整天写代码、维护代码的Java开发者来说,哪些功能最有用呢?

CD2A3F0D_70F3_4607_8ED4_B91A0E71C91B

第14版包含的JEP(Java Enhancement Proposals,Java增强提案)比12版和13版加起来还要多。在这篇文章中,我将主要讨论以下几点:

1、改进的switch表达式,第一次出现在Java 12和13中,在Java 14中获得了完全的支持
2、instanceof支持模式匹配(语言特性)
3、NullPointerException(JVM特性)

希望你在阅读完本文后,积极地代码中实验这些功能,为Java团队提供反馈,并为Java的发展做出贡献。

Switch表达式

Java 14中的switch表达式将会永久存在。如果你需要回忆一下什么是switch表达式,可以参考以前这两篇文章。在公众号互联网架构师后台回复:2T,可以获取架构师视频整套系统教程。

ECB49CEF_EBF2_47ca_8506_DE985BCF536D

在之前的发布中,switch表达式只是一个“预览”阶段的特性。我想提醒一下,“预览”阶段的特性的目的是为了收集反馈,这些特性可能会随时改变,根据反馈结果,这些特性甚至可能会被移除,但通常所有预览特性最后都会在Java中固定下来。

新的switch表达式的优点是,不再有缺省跳过行为(fall-through),更全面,而且表达式和组合形式更容易编写,因此出现bug的可能性就更低。例如,switch表达式现在可以使用箭头语法,如下所示:在公众号互联网架构师后台回复:2T,可以获取架构师视频整套系统教程。

E1369023_7237_4518_9587_75C282C6A27F

文本块

Java 13引入的一个预览功能是文本块。有了文本块,多行的字符串字面量就很容易编写了。这个功能在Java 14中进行第二次预览,而且发生了一些变化。例如,多行文本的格式化可能需要编写许多字符串连接操作和转义序列。下面的代码演示了一个HTML的例子:
4A70FA73_CCEE_4156_B062_71AEA09C14F6

有了文本块,就可以简化这一过程,只需使用三引号作为文本块的起始和结束标记,就能编写出更优雅的代码:

DF0CAFF1_AA0E_46f4_99F6_345573897EE1

与普通的字符串字面量相比,文本块的表达性更好。更多的内容可以参考这篇文章。
9DD9C013_713A_43ce_BAF6_DB3832896DD8

Java 14引入了两个新的转义序列。第一,可以使用新的 s 转义序列来表示一个空格。第二,可以使用反斜杠 来避免在行尾插入换行字符。这样可以很容易地在文本块中将一个很长的行分解成多行来增加可读性。在公众号互联网架构师后台回复:2T,可以获取架构师视频整套系统教程。

例如,现在编写多行字符串的方式如下:

3AF91ABF_AD53_4fd2_8FC4_5C994B7F4B9B

在文本块中使用 转义序列,就可以写成这样:
BB9F16C9_9FA3_406b_BC2F_003533111FFC

instanceof的模式匹配

Java 14引入了一个预览特性,有了它就不再需要编写先通过instanceof判断再强制转换的代码了。例如,下面的代码:

9872B638_60FC_40ea_841C_A959623A2D8F

利用这个预览特性可以重构为:

2BA2FFF8_AD27_42d9_AE2F_1A62A1359196

由于条件检查要求obj为Group类型,为什么还要像第一段代码那样在条件代码块中指明obj为Group类型呢?这可能会引发错误。

这种更简洁的语法可以去掉Java程序里的大多数强制类型转换。2011年的一篇针对相关语言特性的研究论文指出,24%的类型转换都来自于instanceof后的条件语句。

CA7C7EF8_3069_40b8_A8C7_4D16D4AFDB04

JEP 305解释了这项改变,并给出了Joshuoa Bloch的著作《Effective Java》中的一个例子,演示了下面两种等价的写法:

72183E05_7D7B_4254_8EC7_F662A2149FA9

这段代码吗中冗余的CaseInsensitiveString强制类型转换可以去掉,转换成下面的方式:

4E15BD68_AD30_4ba8_A65F_9973B2474620

这个预览特性很值得尝试,因为它打开了通向更通用的模式匹配的大门。模式匹配的思想是为语言提供一个便捷的语法,根据特定的条件从对象中提取出组成部分。在公众号互联网架构师后台回复:2T,可以获取架构师视频整套系统教程。这正是instanceof操作符的用例,因为条件就是类型检查,提取操作需要调用适当的方法,或访问特定的字段。

换句话说,该预览功能仅仅是个开始,以后该功能肯定能够减少更多的代码冗余,从而降低bug发生的可能性。

F0E33704_D593_4624_A3FC_4C7BABCBA947

另一个预览功能就是record。与前面介绍的其他预览功能一样,这个预览功能也顺应了减少Java冗余代码的趋势,能帮助开发者写出更精准的代码。Record主要用于特定领域的类,它的位移功能就是存储数据,而没有任何自定义的行为。

我们开门见山,举一个最简单的领域类的例子:BankTransaction,它表示一次交易,包含三个字段:日期,金额,以及描述。定义类的时候需要考虑多个方面:

  • 构造器
  • getter方法
  • toString()
  • hashCode()和equals()

这些部分的代码通常由IDE自动生成,而且会占用很大篇幅。下面是生成的完整的BankTransaction类:

59434A94_FCED_44b3_AFC9_FD3BE4638FF5
E239E318_813F_458e_A285_409640E9BC6A

Java 14提供了一种方法可以解决这种冗余,可以更清晰地表达目的:这个类的唯一目的就是将数据整合在一起。Record会提供equals、hashCode和toString方法的实现。因此,BankTransaction类可以重构如下:

315245E9_6541_4847_A2F9_4BE3307766AB

通过record,可以“自动”地得到equals,hashCode和toString的实现,还有构造器和getter方法。

要想尝试这个例子,需要用preview标志编译该文件:

328263DD_AA56_43b9_B185_1966DE56D7C8

record的字段隐含为final。因此,record的字段不能被重新赋值。但要注意的是,这并不代表整个record是不可变的,保存在字段中的对象可以是可变的。

如果你有兴趣阅读更多关于record的内容,可以阅读Ben Evans最近在《Java Magazine》上发表的文章。在公众号互联网架构师后台回复:2T,可以获取架构师视频整套系统教程。

2D2B07DD_0C06_46a9_A344_21E5359F7796

请继续关注该功能。从培养新一代的Java开发者的视角来看,Record也很有意思。例如,如果你要培养初级开发者,那么record应该什么时候讲呢?是在讲OOP之前还是之后?

C46876AF_D1DA_446d_AFDE_4C2EC1892ACD

一些人认为,抛出NullPointerException异常应该当做新的“Hello World”程序来看待,因为NullPointerException是早晚会遇到的。玩笑归玩笑,这个异常的确会造成困扰,因为它经常出现在生产环境的日志中,会导致调试非常困难,因为它并不会显示原始的代码。例如,如下代码:

AF2FAC48_F4E1_4a63_A347_10C552EA1442

在Java 14之前,你可能会得到如下的错误:

FF94CACD_1C8E_4a21_B61E_97B016B08EE3

不幸的是,如果在第5行是一个包含了多个方法调用的赋值语句(如getLocation()和getCity()),那么任何一个都可能会返回null。实际上,变量user也可能是null。因此,无法判断是谁导致了NullPointerException。

在Java 14中,新的JVM特性可以显示更详细的诊断信息:

B4CCA5E0_9A0B_430c_A35C_4BFF9F286856

该消息包含两个明确的组成部分:

  • 后果:Location.getCity()无法被调用
  • 原因:User.getLocation()的返回值为null

增强版本的诊断信息只有在使用下述标志运行Java时才有效:

1777CF42_7AD3_4c80_AD59_ABE7378A401A

下面是个例子:

316AAC4A_8D67_4672_9DA0_C88BE7D4506E

在以后的版本中,该选项可能会成为默认。

这项改进不仅对于方法调用有效,其他可能会导致NullPointerException的地方也有效,包括字段访问、数组访问、赋值等。

6325AE4F_D22D_447d_BCFC_D130D063137F

Java 14提供了几个新的预览版语言特性和更新,能很好地帮助开发者完成日常工作。Java 14还引入了record,这是一种创建精确数据类的新方法。此外,NullPointerException的消息经过了改进,能显示明确的诊断信息。switch表达式也成了Java 14的一部分。文本块功能可以帮你处理多行字符串,这是在引入了两个新的转义序列之后的另一预览功能。还有一项改动就是JDK Flight Recorder的事件流。

可见,Java 14带来了许多创新。你应该尝试一下这些功能,然后反馈给Java的开发团队。

原文发布时间:2020-03-19
本文作者:Raoul-Gabriel Urma
本文来自:互联网架构师 公众号 了解相关信息可以关注“互联网架构师”

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文链接:https://yq.aliyun.com/articles/750530
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章