龙目岛(Lombok)Getter / Setter vs Java 14记录


10

我喜欢Lombok项目,但如今,我正在阅读并尝试Java 14的一些新功能。

在新功能内部,有record关键字,该关键字允许创建具有以下内置功能的类:构造函数,私有最终字段,访问器,equals / hashCode,getter和toString方法。

现在我的问题是:最好依靠Lombok的功能,还是我们应该开始使用记录功能:

最好使用这个:

record Person (String name, String surname) {}

或者那个:

@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class GetterSetterExample {
  @Getter private int name;
  @Getter private int surname;
}

两种方法的优缺点是什么?


一方面,record对于期望使用JavaBeans风格的getter和setter的方法来说,它是行不通的。
Mark Rotteveel

2
Rotteveel的注释意味着记录中的属性访问器方法被命名为与属性相同的名称。因此,alice.phoneNumber()不是像JavaBeans get那样以开头的约定alice.getPhoneNumber()
罗勒·布尔克

1
record功能是预览功能尚未准备好用于生产中。
罗勒·布尔克

与类相比,记录有很多限制,例如,一条记录不能扩展其他记录或类,请查看此JEP openjdk.java.net/jeps/359的限制部分以 了解更多详细信息
NAIT

Answers:


9

Lombok和recordJava语言的功能是用于不同事物的不同工具。有一些表面上的重叠,但不要让那分散您的注意力。

龙目岛主要是关于句法便利性。它是一个预装有一些已知有用代码模式的宏处理器。它没有赋予任何语义;它会根据您在代码中设置的带有注释的旋钮自动执行模式。Lombok纯粹是关于实现数据承载类的便利。

记录是一种语义特征;它们是名义元组。通过进行一个以Point 表示的元组的语义声明,(int x, int y)编译器可以从该状态描述中得出其表示以及构造,声明,相等,哈希和字符串表示协议。由于它们具有语义,因此读者和框架也可以对记录的API充满信心。(这在语法上也可能很方便;如果是这样,那就太好了。)


1
+1 Brian Goetz:假设您可以将当前的Lombok版本添加到您的IDE中。我不知道Lombok在更快的代码读取方面是否具有任何有意义的优点,而此类注释不会授予类注释。
干线

4

我也一直在使用这种组合玩了一段时间,并且动手了一下,我可以列举出以下差异:

龙目岛

  • 记录尚未发布,只是预览功能。因此,留在龙目岛更有意义。
  • 它们尚不具备消除Lombok的强大工具。请注意,该库不仅提供,还提供更多的功能@Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCode
  • 自己经历过,这EqualsAndHashCode与您迁移到记录时所期望的不同。

记录

  • 另一方面,如果对象表示的要求是成为“数据载体”,您仍然可以寻求Records的优势,而无需依赖其他库来减少样板代码来精确地执行该任务。因此,作为结论,此博客阅读以下内容:

    它还将帮助团队消除对底层模式的许多手工编码实现,并减少或消除对Lombok之类的库的需求。

当然,在日常的基础上,根据项目的要求来选择遵循和实践的方式总是明智的。


注意-我会尝试使用更多示例来保持更新,以使用户当前可以频繁使用它们。
Naman

3

注意:除了注释的那棵圣诞树,您可以@Value在类中使用它。请注意,这使类为final,并使所有字段均为private和final,并为您提供所有其余字段。这接近于记录是什么(它们也是最终的,内部的所有字段都是最终的)。

record仍处于预览状态,因此对于生产代码而言,显然尚不适合。使用龙目岛。

一旦记录超出预览范围,情况将更加复杂。龙目岛FAR更灵活;您可以轻松地在某些新方面进行交换而不必重写所有代码(例如,您可以在类中添加一个“ extends”子句,而不必随后手写equals和hashCode方法;某些记录不能为您提供)。龙目岛还为您提供了更多功能:例如,您可以通过添加@Builder注释来添加构建器;记录不能做的事情。

如果极不可能在您要设计的类中使用任何一种,我将使用记录。

免责声明:我是Lombok项目的核心撰稿人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.