5

JAVA 14 新特性 - switch表达式

 3 years ago
source link: https://minei.me/archives/541.html
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.

JAVA 14 新特性 - switch表达式

boyizmen
2020-04-25

现在的Java版本号刷的和Chrome一样快,在最新的14版本中加入了switch表达式,和以前使用的switch语句不同,switch表达式带来的不仅仅是编码上的流畅,同时精简了switch语句的使用方式,并且是兼容以前的switch语句。

以前的switch语句在分支结束的时候往往需要我们手动的进行break,否则switch会一直进行下去直到switch语句结束,这很容易造成一些难以排查的bug。switch语句使用冒号来作为分支代码块的的开始,而switch表达式提供了新的流程切换方式:-> 符号右边的代码执行完成之后会自动结束整个switch语句。-> 右边可以是表达式,代码块或是抛出异常。

由于变成了表达式,现在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;

虽然switch表达式的出现在一些流程分支上简化了不少编码,但是需要注意以下几点:

  1. 使用时必须要覆盖到所有可能的case分支(包括default);
  2. 每个分支都必须要yield一个值或者抛出异常;
  3. switch表达式无法使用break,return,continue来跳出;
    枚举在使用switch表达式的时候只需要覆盖到所有的枚举值即可,默认的default分支编译期会自动处理加入到表达式中。

上面的要点提到了 yield,它并不是一个关键字,和 var 一样,都是被严格限制了的类型名。yield 可理解为让,或者是返回。
yield语句

上面的switch表达式是比较简单的yield语句,看下面的代码:

  1. int j = switch (day) {
  2. case MONDAY -> 0;
  3. case TUESDAY -> 1;
  4. default -> {
  5. int k = day.toString().length();
  6. int result = f(k);
  7. yield result;

因为switch表达式是兼容以前的switch语句,所以也可以这么写:

  1. int result = switch (s) {
  2. case "Foo":
  3. yield 1;
  4. case "Bar":
  5. yield 2;
  6. default:
  7. System.out.println("Neither Foo nor Bar, hmmm...");
  8. yield 0;

查看使用switch表达式和switch语句所得到的class文件,发现基本一样,说明switch表达式的实现仍然是Java的语法糖,都是编译器在编译的时候进行处理的。
switch表达式的出现可以看到Java在提高使用者编码效率上还是在不停的努力,期待可以看到更多的新特性来提升编码效率和体验。

版权所有丨转载请注明出处:https://minei.me/archives/541.html


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK