从Java 8 到 17(LTS) 新增的那些关键字

Java 9

modules 对于 个人开发者 意义其实没有那么大,仍然是给框架作者提供的更多控制,更不像是模块化,而是像权限控制。

你可以把更大的功能做成“模块”,仅暴露需要被用到的“接口”

module

声明模块

e.g:


module myModuleName {
    // all directives are optional
}

requires

标注需要用到的包

module my.module {
    requires module.name;
}

exports

“公开”可以被调用的包

module my.module {
    exports com.my.package.name;
}

Tips

模块化的使用远不仅于此

个人感觉 非框架开发者不需要过多了解模块化的部分

即使是框架开发者,这样的事情也只会做起来很麻烦,尽管它有更好的可维护性,更健壮的 开闭原则。

Java >= 10

sealed

限定一个类的继承,需要和 permits 配合使用,使用条件较为严格。

  1. 被继承的类必须是继承被sealed标记的类, 且必须是 被 sealed / non-sealed / final 标记的类。
  2. 必须同包

permits

指定那些类可被继承 需要和 sealed 配合使用.

在我理解这个功能更多面向框架/工具开发者。太多太多人乱用Spring的类了,这会造成升级和维护异常的困难。

e.g:

public sealed class GenshinAvatar permits Eula, Keqing, Ganyu {

}

// final
public final class Eula extends GenshinAvatar {}

public final class Ganyu extends GenshinAvatar {}

// sealed
public sealed class Keqing extends GenshinAvatar permits KeqingBaby {}

// non-sealed
public non-sealed class KeqingBaby extends Keqing {}

record

一个新类型,比写Getter Setter要方便得多。

其他的优点也很明显 天生线程安全(属性不可变)。

想要改变值可以利用 CoW。

目前来说有个不方便的地方就是序列化和反序列化,Gson目前还无法做到,只能用 JDK自带的来序列化和反序列化了。

e.g:

record Item(Long productId, Long count) implements Serializable{

}

var

自动类型推断。这个其实对于 IDE 来讲没什么用。

java本身来说就是静态类型语言 例如下面的 l = 10,接下来并不能将l改变为其他类型。

e.g:

var l = 10L;

Long lon = 10L;

yield

break可以不用再写了。 java魔法糖其实还是蛮少,蛮谨慎的。

e.g:

int value = switch (greeting) {
    case "hi":
        System.out.println("I am not just yielding!");
        yield 1;
    case "hello":
        System.out.println("Me too.");
        yield 2;
    default:
        System.out.println("OK");
        yield -1;
};

Tips

Ref:

// java 关键字列表
https://en.wikipedia.org/wiki/List_of_Java_keywords

// yield 关键字解释
https://stackoverflow.com/questions/58049131/what-does-the-new-keyword-yield-mean-in-java-13

// java9模块化解释
https://www.baeldung.com/java-9-modularity