从Java 9 到 Java 17之Java 13

举报
码农小胖哥 发表于 2022/04/01 01:23:36 2022/04/01
【摘要】 Java 13在2019年9月发布,这个版本引入的正式可用特性几乎没有,是我认为最无聊的版本之一。所以我们跳过Java 13直接来看Java 14吧。 Switch表达式 我觉得switch表达式在日常中开发被使用的太少了,不是因为这个关键字和if比起来太“难”,而是因为它很冗长,而且这种视觉上的噪声容易掩盖那些难以调试的...

a59eb3e03ef889c7d6086bb2a3fa3a3f.gif

Java 13在2019年9月发布,这个版本引入的正式可用特性几乎没有,是我认为最无聊的版本之一。所以我们跳过Java 13直接来看Java 14吧。

Switch表达式

我觉得switch表达式在日常中开发被使用的太少了,不是因为这个关键字和if比起来太“难”,而是因为它很冗长,而且这种视觉上的噪声容易掩盖那些难以调试的错误,特别是那些break语句,就像下面这样:


   
  1. switch (day) {
  2.     case MONDAY:
  3.     case FRIDAY:
  4.     case SUNDAY:
  5.         System.out.println(6);
  6.         break;
  7.     case TUESDAY:
  8.         System.out.println(7);
  9.         break;
  10.     case THURSDAY:
  11.     case SATURDAY:
  12.         System.out.println(8);
  13.         break;
  14.     case WEDNESDAY:
  15.         System.out.println(9);
  16.         break;
  17.     default:
  18.         System.out.println(11);    
  19. }

一点也不清晰,所以我写Java时通常拒绝使用switch表达式。

新的switch标签

为了简化switch,Java在引入了 switch标签case L ->这样一个预览特性,如果输入匹配L,则仅执行标签右侧的代码。我们还建议每个 case 允许多个常量,用逗号,分隔。之前的代码现在可以写成:


   
  1. switch (day) {
  2.     case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
  3.     case TUESDAY                -> System.out.println(7);
  4.     case THURSDAY, SATURDAY     -> System.out.println(8);
  5.     case WEDNESDAY              -> System.out.println(9);
  6.     default                     -> System.out.println(11);    
  7. }

case L ->switch标签右侧的代码被限制为表达式、代码块或throw语句。如果我们希望Switch语句有返回值可以这样写:


   
  1. int numLetters = switch (day) {
  2.     case MONDAY, FRIDAY, SUNDAY -> 6;
  3.     case TUESDAY                -> 7;
  4.     case THURSDAY, SATURDAY     -> 8;
  5.     case WEDNESDAY              -> 9;
  6.     default                     -> 11;    
  7. };

当Switch语句赋值给变量时default分支是必须的。

yield 受限标识符

case L ->右边是一个代码块而且根据case条件会产生一个值的情况下,根据我们的思维惯性会这样写:


   
  1. int numLetters = switch (day) {
  2.       
  3.             case WEDNESDAY              -> {
  4.                 System.out.println("day = " + day);
  5.                 // 错误的写法,会引发编译错误
  6.                 return 9;
  7.             };
  8.             default -> 11;
  9.         };

你会发现上面的写法通不过编译,这是语境问题,当满足case条件时并不是返回(return)一个值的意思,而是产生(yield)了一个值。所以引入了一个新的受限标识符yield注意不是关键字)来处理这个语境问题。


   
  1. int numLetters = switch (day) {
  2.       
  3.             case WEDNESDAY              -> {
  4.                 System.out.println("day = " + day);
  5.                 // yield 才是正确的
  6.                 yield 9;
  7.             };
  8.             default -> 11;
  9.         };

更合理的空指针提示

空指针异常是Java最常见的异常之一,在Java 14之前的空指针异常堆栈信息中只是提示给定行的发生了NullPointerException,不够直观清晰:


   
  1. Exception in thread "main" java.lang.NullPointerException
  2. at cn.felord.SomeClass.main(SomeClass.java:17)

现在日志会说明空指针的具体来源:


   
  1. Exception in thread "main" java.lang.NullPointerException: Cannot store to int array because "arr" is null
  2. at cn.felord.SomeClass.main(SomeClass.java:17)

我们可以明确地知道arrnull导致了空指针。

其它的一些变更

由于一些预览特性并没有转正,甚至在未来可能移除,所以这里不再进行详细的说明。感兴趣的可以到Java 14发行日志[1]页面查看。多多关注,点赞,转发,评论,后续为大家带来更多有价值的内容输出。

参考资料

[1]

Java 14发行日志: https://openjdk.java.net/projects/jdk/14/

干了九年开发,我干黄了90%的项目

2021-12-04

566aae57aa757edf4bfa53dc8efd88ac.png

是的,Spring Boot 3.0 的第一个快照版本发布了

2021-12-02

26d205c88a646dea0c1382d26c957fab.png

Java如何校验两个文件内容是相同的?

2021-12-01

4cf4be1d0659e45bbc7b4e358cc89c2f.png

5405497b15d8bc85281673edca362bd0.gif

文章来源: felord.blog.csdn.net,作者:码农小胖哥,版权归原作者所有,如需转载,请联系作者。

原文链接:felord.blog.csdn.net/article/details/121782362

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。