英文:Oracle,翻译:CSDN,作者:Raoul-Gabriel Urma

链接:blogs.oracle.com/javamagazine/java-14-arrives-with-a-host-of-new-features

以下为译文:

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

  • 改进的switch表达式,第一次出现在Java 12和13中,在Java 14中获得了完全的支持

  • instanceof支持模式匹配(语言特性)

  • NullPointerException(JVM特性)

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

一、Switch表达式

java 14 中的switch表达式将会永久存在。如果你需要回忆一下什么是switch表达式,可以参考以前的这两篇文章(https://blogs.oracle.com/javamagazine/new-switch-expressions-in-java-12,https://blogs.oracle.com/javamagazine/inside-java-13s-switch-expressions-and-reimplemented-socket-api)。

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

新的switch表达式的优点是,不再有缺省跳过行为(fall-through),更全面,而且表达式和组合形式更容易编写,因此出现bug的可能性就更低。例如,switch表达式现在可以使用箭头语法,如下所示:

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

二、文本块

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

String html = "<HTML>" +
"\n\t" + "<BODY>" +
"\n\t\t" + "<H1>\"Java 14 is here!\"</H1>" +
"\n\t" + "</BODY>" +
"\n" + "</HTML>";

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

String html = """
<HTML><BODY><H1>"Java 14 is here!"</H1></BODY>
</HTML>""";

与普通字符串字面量相比,文本块的表达性更好。更多的内容可以参考这篇文章    (https://blogs.oracle.com/javamagazine/text-blocks-come-to-java)。

Java 14引入了两个新的转义序列。第一,可以使用新的 \s 转义序列来表示一个空格。第二,可以使用反斜杠 \ 来避免在行尾插入换行字符。这样可以很容易地在文本块中将一个很长的行分解成多行来增加可读性。

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

String literal ="Lorem ipsum dolor sit amet, consectetur adipiscing " +"elit, sed do eiusmod tempor incididunt ut labore " +"et dolore magna aliqua.";

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

String text = """Lorem ipsum dolor sit amet, consectetur adipiscing \elit, sed do eiusmod tempor incididunt ut labore \et dolore magna aliqua.\""";

三、instanceof的模式匹配

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

if (obj instanceof Group) {Group group = (Group) obj;// use group specific methodsvar entries = group.getEntries();
}

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

if (obj instanceof Group group) {var entries = group.getEntries();
}

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

这种更简洁的语法可以去掉Java程序里的大多数强制类型转换。(2011年的一篇针对相关语言特性的研究论文(http://www.cs.williams.edu/FTfJP2011/6-Winther.pdf)指出,24%的类型转换都来自于instanceof后的条件语句。)

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

@Override public boolean equals(Object o) {return (o instanceof CaseInsensitiveString) &&((CaseInsensitiveString) o).s.equalsIgnoreCase(s);
}

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

@Override public boolean equals(Object o) {return (o instanceof CaseInsensitiveString cis) &&cis.s.equalsIgnoreCase(s);
}

这个预览特性很值得尝试,因为它打开了通向更通用的模式匹配的大门。模式匹配的思想是为语言提供一个便捷的语法,根据特定的条件从对象中提取出组成部分。这正是instanceof操作符的用例,因为条件就是类型检查,提取操作需要调用适当的方法,或访问特定的字段。

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

四、Record

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

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

  • 构造器

  • getter方法

  • toString()

  • hashCode()和equals()

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

public class BankTransaction {private final LocalDate date;private final double amount;private final String description;public BankTransaction(final LocalDate date,final double amount,final String description) {this.date = date;this.amount = amount;this.description = description;}public LocalDate date() {return date;}public double amount() {return amount;}public String description() {return description;}@Overridepublic String toString() {return "BankTransaction{" +"date=" + date +", amount=" + amount +", description='" + description + '\'' +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;BankTransaction that = (BankTransaction) o;return Double.compare(that.amount, amount) == 0 &&date.equals(that.date) &&description.equals(that.description);}@Overridepublic int hashCode() {return Objects.hash(date, amount, description);}
}

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

public record BankTransaction(LocalDate date,double amount,String description) {}

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

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

javac --enable-preview --release 14 BankTransaction.java

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

如果你有兴趣关于record的内容,可以阅读Ben Evans最近在《Java Magazine》上发表的文章(https://blogs.oracle.com/javamagazine/records-come-to-java)。

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

五、NullPointerException

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

var name = user.getLocation().getCity().getName();

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

Exception in thread "main" java.lang.NullPointerExceptionat NullPointerExample.main(NullPointerExample.java:5)

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

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

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Location.getCity()" because the return value of "User.getLocation()" is nullat NullPointerExample.main(NullPointerExample.java:5)

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

  • 后果:Location.getCity()无法被调用

  • 原因:User.getLocation()的返回值为null

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

-XX:+ShowCodeDetailsInExceptionMessages下面是个例子:
java -XX:+ShowCodeDetailsInExceptionMessages NullPointerExample

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

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

六、总结

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

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


#接力技术,链接价值#精彩推荐1. “网红” WebAssembly 与 K8s 如何实现双剑合璧?2. Java开发者必备:超全的Java问题排查工具单3. "分布式事务一致性" 看这一篇就够了
4. 银弹?刚柔并济的开源分布式事务解决方案5. 句句属实,90%的人都被需求整“哭”过!6. 阿里技术:如何画出一张合格的技术架构图?


http://www.taodudu.cc/news/show-1178923.html

相关文章:

  • 2020 年 3 月全国程序员工资排名!
  • 阿里技术:基于Kafka+Flink+Redis的电商大屏实时计算案例
  • 技术人必看:15张图对比高效与瞎忙的区别!
  • 26岁创造UNIX的编程大佬,退休后却成为一名飞行员
  • 跳槽到月薪三万的公司,但是不到半年就后悔了
  • 史海峰:万字长文剖析技术人如何成长
  • 腾讯总监周颢:亿级用户微信采用的架构宝典
  • 趣图:只有程序员才能看懂这个疫情号召
  • 偷源代码!还和前东家一起投标……最终被判 3 年
  • 19岁P8入驻阿里?从阿里的人才成长体系学习
  • 趣图:老师讲算法 vs 油管三哥讲算法
  • 17 岁高中生独立开发全球疫情追踪网站火了!
  • StackOverFlow优选的十条编程观点
  • 假如把支付宝存储服务器炸了,里面的钱还在么?
  • 漫画:互联网大佬都是这样聊天的
  • 左耳朵耗子:15条有效提高编程的小贴士
  • 干货|Elastic 在顶级互联网公司的应用案例浅析
  • 收藏!架构师需要掌握的99条铁律
  • 张一鸣:做CEO要避免理性的自负
  • 漫画:程序员和产品经理撕得真是太太太太厉害了
  • 干货实战|基于Elastic Stack的日志分析系统
  • 陆奇最新分享:数字化进程加速,创新者如何把握机会?
  • 阿里技术|Java 的这些坑,你踩到了吗?
  • 李猛:从MongoDB迁移到ES后,我们减少了80%的服务器
  • 可能是全网最通俗易懂的微服务架构改造解读
  • 掌握 Kafka,看这篇就足够了
  • 学习Nginx,看这篇就就好了!(多图详解)
  • 缓存穿透、缓存击穿和缓存雪崩实践附源码
  • 从0到1设计一个秒杀系统
  • 阿里高专王夕宁:Istio网关之南北向流量管理

求老板放过!我Java8还没用呢,Java14又来了...相关推荐

  1. 什么? 你还没用过 Cursor? 智能 AI 代码生成工具 Cursor 安装和使用介绍

    作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,<性能优化方法论>作者.<解锁大厂思维:剖析<阿里巴巴Java开发手册>>.<再学经 ...

  2. cdialog创建后马上隐藏_都2020了,你还没用上这些Windows的“隐藏神技能”?

    如今,电脑系统 的天下都被Windows和macOS给占领了,那么它们之间的较量自然是不少.关于它们谁更好用的话题从来就没断过,也从来没有什么标准答案,只能说是萝卜青菜各有所爱吧.可每次看到那些说Wi ...

  3. 优质神器!推荐7个小众好用的软件,也许你还没用过

    推荐7个小众好用的软件,也许你还没用过. 1.词根词缀记忆词典 词根词缀字典是一款专门查询单词记忆法的字典.词根.词缀.词源,口诀.谐音.谐音.对照.看图背单词等等应有尽有!软件总结了上千余条词根和近 ...

  4. 被老板怼“离职了还好意思抢红包”,别狗血式退群,高手都用3招

    小林办理离职手续当天,公司老板(领导)在群里发红包,小林抢到6元.领导在群里不客气地怼小林,"你都离职了,还好意思抢红包?"小林懵了,立即问火锅哥,我该怎么圆场? 我正好在搞职场情 ...

  5. 还没用上 JDK 11,12 就要来了

    更新速度快的飞起,JDK 12 早期访问构建版已发布,你现在用到了第几版本? 自从 2017 年 9 月 21 日 Java 9 正式发布之时,Oracle 就宣布今后会按照每六个月一次的节奏进行更新 ...

  6. 用 Python 分析了 6000 款 App,看看哪些神器你还没用过?

    摘要: 如今移动互联网越来越发达,各式各样的 App 层出不穷,也就产生了优劣之分,相比于普通 App,我们肯定愿意去使用那些良心佳软,但去发现这些 App 并不太容易,本文使用 Scrapy 框架爬 ...

  7. 工作汇报ppt案例_职场PPT实战:秒杀同事,老板爱看,汇报还得这么干

    大家好,我是肥宅. 这一期我们要来讲一讲职场PPT制作过程中,大家往往都会忽略掉的一个事情--标题.我们还是通过上期的案例来把这个问题简单的讲解一下.上一期中,我们把这个案例的封面做了一个小的调整,讲 ...

  8. 做前端的你还没用这些软件?? out 啦

    1. 编辑器 写代码只是生产软件过程中的一环.无论是数据结构.编译原理.操作系统还是组成原理都是编码的重要基础,试问没有学过编译原理的人能够针对性地进行编译优化吗?不懂操作系统的人能玩得转linux吗 ...

  9. 才知道,OPPO手机还没用多久就卡顿,可能是因为这3个功能没关

    说起OPPO手机给大家的印象都是高价低配,但最近OPPO似乎走起了性价比的路线,Reno Ace.Realme X2 pro都代表着oppo走向了性价比的路线.虽然OPPO手机现在拥有了极高的性价比, ...

最新文章

  1. R语言ggplot2可视化在散点图中的每个点上绘制两个错误条:常见的是垂直错误条,它对应于Y值点上的错误(error bar),添加与X轴(水平)相关的错误条(error bar)
  2. Linux下 memcached安装以及启动
  3. 秒后面的单位是什么_比光年还大的长度单位,你知道几个?
  4. python时间去掉t_Python的set集合详解
  5. [css] 字体的粗细的属性是用哪一个?它有哪些属性值?
  6. linux 中ifconfig命令 结果解释
  7. JavaSE基础篇之-Java 流(Stream)、文件(File)和IO
  8. python linux区域截屏,用Python写一个像QQ可快捷键唤起区域截屏的应用
  9. matlab五维图,一张图让你看清楚从0维到10维的终极解释
  10. 日语简体形与敬体形 - 新版标日22课
  11. 在C语言中的实型变量分为两种类型6,在C语言中的实型变量分为两种类型.doc
  12. 方框加对勾怎么输入_对号“√”怎么输入到方框“□”-空格对号
  13. php中file_get_contents与curl性能比较分析
  14. 网站建设之需要改进的地方
  15. 输入存款金额并选择存款种类,计算出利息(不计利息税)和本息合计
  16. 《Dreamweaver CS6 完全自学教程》笔记 第十章:表单的使用
  17. 膜拜!阿里内部学习的五大深入理解Java虚拟机PDF,真的强
  18. 智慧工地解决方案的关键技术
  19. 计算机控制系统的类型的ppt,计算机控制系统及应用课件.ppt
  20. 用java代码改变图片的尺寸

热门文章

  1. js和python交互_JSShell:一个基于python的交互式Shell
  2. python列表_Python列表抽象
  3. gis里创建要素面板怎么打开_周末技术流 | 基于GIS的地形可视化分析
  4. linux系统chmod缩写,文件属性控制命令chmod
  5. php+当前+日期+函数是,php时间日期的处理函数
  6. java复习题_java习题-(static)
  7. 5.1.2全景声音箱摆位_全景声音响系统音箱应该如何摆位(5.1.2、5.1.4篇)
  8. MyBatisPlus自动生成代码springboot+mybatis+mysql 以及动态sql生成方法(测试可用版)
  9. 操作系统之进程管理:4、线程与多线程
  10. 数据结构之外部排序:失败树