Java记录与lombok @Value

pep*_*lbe 8 java lombok java-15

记录是自 Java 14(第一个预览版)和 Java 15(第二个预览版)以来的新语言功能。根据我的理解,它们将用于减少不可变数据对象中的样板代码。

所以这一行:

public record Person (String firstName, String lastName) {}
Run Code Online (Sandbox Code Playgroud)

相当于声明一个具有私有final字段、每个字段的getter、一个公共构造函数以及equals、hashCode和toString方法的类。

@Value然而,这与使用 lombok注释几乎相同:

@Value
public class Person {
    
    String firstName;
    String lastName;
}
Run Code Online (Sandbox Code Playgroud)

除了你显然不需要处理 lombok 依赖之外,使用记录还有什么优点吗?

Ani*_*wat 5

除了阿克塞尔已经建议的之外:

  • @Value生成不可变的 java bean,同时record不是 java bean。

  • 记录是内置功能,不需要任何插件或安装。

  • Lombok 允许在记录继承的同时从类继承j.l.Record。扩展类会生成一个不言自明的警告:

生成 equals/hashCode 实现,但不调用超类,即使此类不扩展 java.lang.Object。如果这是故意的,请将“(callSuper=false)”添加到您的类型中。


Axe*_*xel 4

恕我直言,最大的优点是它是标准的。我们在标准库中拥有的几乎所有内容在标准化之前都已以某种变体形式提供。但我更喜欢让一切正常工作并兼容,而不是必须处理引入不同版本的 jodatime、lombok 等的依赖项。

但我们还需要一段时间才能看到 JDK 16+ 被广泛采用。因此,如果您创建应用程序并且可以自由选择受支持的最低 JDK 版本,请使用记录。如果您创建一个库,您可能会以 JDK 11(因为它是 LTS)兼容性为目标,并且必须使用 lombok。