1

Java 13、14都有哪些新特性?

 2 years ago
source link: https://blog.didispace.com/java-13-new-features/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Java 13、14都有哪些新特性?

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

Switch表达式

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

switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
System.out.println(6);
break;
case TUESDAY:
System.out.println(7);
break;
case THURSDAY:
case SATURDAY:
System.out.println(8);
break;
case WEDNESDAY:
System.out.println(9);
break;
default:
System.out.println(11);
}

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

新的switch标签

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

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

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

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

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

yield 受限标识符

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

int numLetters = switch (day) {

case WEDNESDAY -> {
System.out.println("day = " + day);
// 错误的写法,会引发编译错误
return 9;
};
default -> 11;
};

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

int numLetters = switch (day) {

case WEDNESDAY -> {
System.out.println("day = " + day);
// yield 才是正确的
yield 9;
};
default -> 11;
};

更合理的空指针提示

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

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

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

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

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

其它的一些变更

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

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

本文作者:码农小胖哥,
原文链接:https://mp.weixin.qq.com/s/gob7PAN-21bO23CDAB8cSg
版权归作者所有,转载请注明作者、原文、译者等出处信息

Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK