从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
配合使用,使用条件较为严格。
- 被继承的类必须是继承被sealed标记的类, 且必须是 被 sealed / non-sealed / final 标记的类。
- 必须同包
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