lostars
发布于 2020-04-25 / 2765 阅读
0

JAVA 14 新特性 - switch表达式

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

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

由于变成了表达式,现在switch可以用来进行赋值,比如:

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

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

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

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

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

int j = switch (day) {
    case MONDAY  -> 0;
    case TUESDAY -> 1;
    default      -> {
        int k = day.toString().length();
        int result = f(k);
        yield result;
    }
};

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

int result = switch (s) {
    case "Foo": 
        yield 1;
    case "Bar":
        yield 2;
    default:
        System.out.println("Neither Foo nor Bar, hmmm...");
        yield 0;
};

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