记录是Java 14(第一次预览版)和Java 15(第二次预览版)以来的新语言特性。根据我的理解,它们将用于减少不可变数据对象中的样板代码。
那么这一行:
public record Person (String firstName, String lastName) {}
相当于声明一个具有私有final字段、每个字段的getter、公共构造函数和equals、hashCode和toString方法的类。
然而,这与使用lombok@Value
注释几乎相同:
@Value
public class Person {
String firstName;
String lastName;
}
除了明显不需要处理lombok依赖之外,使用记录还有什么好处吗?
除了Axel已经建议的:
-
@Value
生成不可变java bean,而record
不是java bean。 -
记录是一个内置的功能,它不需要任何插件或安装。
-
Lombok允许从类继承,而记录继承
j.l.Record
。扩展一个类会生成一个自解释的警告:
生成equals/hashCode实现,但不调用超类,即使该类不扩展java.lang.Object。如果这是有意为之,请在类型中添加'(callSuper=false)'。
我认为最大的优点是它是标准的。在标准化之前,我们标准库中几乎所有的东西都以某种变体提供。但是我更喜欢让所有的东西都工作和兼容,而不是必须处理不同版本的jodatatime, lombok等的依赖关系。
但是我们还需要一段时间才能看到JDK 16+被广泛采用。因此,如果您创建了一个应用程序,并且可以自由选择支持的最小JDK版本,请使用记录。如果您创建一个库,您可能会以JDK 11(因为它是LTS)兼容性为目标,并且您必须使用lombok。