48

我喜欢Lombok项目,但这些天我正在阅读并尝试 java 14 的一些新功能。

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

现在我的问题是:更好地依赖 Lombok 的功能还是我们应该开始使用记录功能:

最好使用这个:

record Person (String name, String surname) {}

或者那个:

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

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

4

6 回答 6

64

Lombok 和recordJava 语言的特性是针对不同事物的不同工具。有一些表面上的重叠,但不要让它分散你的注意力。

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

记录是一种语义特征;它们是名义元组。通过制作一个元组的语义声明,编译Point (int x, int y)可以从这个状态描述中派生出它的表示,以及构造、声明、相等、散列和字符串表示协议。因为它们带有语义,阅读器和框架也可以对记录的 API 有更高的信心。(这在语法上也可能很方便;如果是这样,那就太好了。)

于 2020-04-20T14:31:50.220 回答
21

@Value注意:你可以在课堂上使用,而不是那个圣诞树的注释。请注意,这使类成为最终的,并使所有字段都成为私有和最终的,并为您提供所有其余的。这接近于记录(它们也是最终的,并且里面的所有字段都是最终的)。

record仍处于预览阶段,因此对于生产代码,显然它还不适合。使用龙目岛。

一旦记录无法预览,情况就会变得更加复杂。Lombok更加灵活;您可以轻松地在一些新方面进行交换,而无需重写所有代码(例如,您可以向您的类添加一个“扩展”子句,而不必随后手写 equals 和 hashCode 方法;一些记录无法提供给您)。@BuilderLombok 还为您提供了更多功能:例如,您可以通过添加注释来添加构建器;不是记录可以做的事情。

如果您极不可能将其中任何一个用于您正在设计的课程 - 我会使用记录。

免责声明:我是 Project Lombok 的核心贡献者。

于 2020-04-19T15:50:06.750 回答
10

我也一直在玩这个组合一段时间,稍微动手,我可以列出以下差异:

龙目岛

  • 记录还不是一起消除龙目岛的强大工具。请注意,该库提供的不仅仅是@Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCode.
  • 亲身体验,迁移到记录时EqualsAndHashCode与您所期望的不一样。

记录

  • 记录是语言的官方部分,支持所有主要的 IDE
  • 另一方面,如果您的对象表示要求是“数据载体”,您仍然可以寻求 Records 的优势,而无需依赖额外的库来减少样板代码以精确执行该操作。因此,作为结论性说明,此博客内容如下:

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

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

于 2020-04-19T16:06:11.433 回答
6

虽然 Brian 很好地解释了 Lombok 和记录的不同目标,但他没有解释何时使用哪个。

如果您的课程是“透明的、浅层不可变的数据聚合”,那么记录将做得很好,因为:

  1. 它的仪式甚至比用龙目岛注释的课程还要少
  2. 它带有语义信息“这是一个不可变的数据类”(正如 Brian Goetz 的回答中所强调的那样)。这种语义信息可能对程序员和框架都很有价值。

如果你的班级不能忍受记录的限制(例如不变性、没有构建器、不可扩展),我仍然会使用 Lombok。

于 2020-10-21T09:49:02.587 回答
1

Java Records 不需要任何额外的依赖,所以我认为最好使用它们而不是 Lombok。

如果您的项目支持 Java 14,您已经可以在 Eclipse 中使用它们。

市场上有一个插件:

https://marketplace.eclipse.org/content/java-14-support-eclipse-2020-03-415

于 2020-08-26T13:50:55.323 回答
-1

简而言之,如果您使用 Java 进行函数式编码,请使用记录。否则使用 Lombok,它更加灵活和强大。

此规则有一些例外,例如在 API 编码中。

于 2021-12-02T11:19:48.047 回答