龙目岛 getter/setter vs Java 14 条记录

Lombok getter/setter vs Java 14 record

我喜欢 Lombok 项目,但最近我正在阅读和尝试 java 14.

的一些新功能

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

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

最好用这个:

record Person (String name, String surname) {}

或者那个:

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

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

注意:您可以在 class 上使用 @Value 而不是注释圣诞树。请注意,这使 class 成为最终的,并使所有字段都成为私有和最终的,并为您提供所有其余部分。这接近记录的内容(它们也是最终的,并且其中的所有字段都是最终的)。

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

一旦记录不在预览范围内,情况就更复杂了。 Lombok FAR 更灵活;您可以轻松地交换一些新的方面,而不必重写所有代码(例如,您可以在 class 中添加一个 'extends' 子句,而不必再手写 equals 和 hashCode 方法;一些东西记录不能给你)。 Lombok 还为您提供了更多功能:例如,您可以通过添加 @Builder 注释来添加构建器;不是唱片能做到的。

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

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

我也研究了这个组合一段时间,稍微 hands-on 我可以列出以下差异:

龙目岛

  • 记录还不是一个强大的工具来消除龙目岛。请注意,图书馆提供的不仅仅是 @Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCode.
  • 亲身体验,EqualsAndHashCode和你想象的不一样when it comes to migrating to records

记录

  • 记录是语言的官方部分,支持所有主要 IDE
  • 另一方面,如果您的 object 表示要求是“数据载体”,您仍然可以利用 Records,而无需依赖额外的库来减少要执行的样板代码正是这样。这就是作为结论性说明 this blog 阅读以下内容的原因:

It will also help teams eliminate many hand-coded implementations of the underlying pattern and reduce or remove the need for libraries like Lombok.

当然,在day-to-day的基础上,根据项目的需要选择遵循和实践的方式总是明智的。

Lombok 和 Java 语言的 record 功能是针对不同事物的不同工具。有一些表面上的重叠,但不要让它分散您的注意力。

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

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

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

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

市场上有一个插件:

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

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

如果您的 class 是 "transparent, shallowly immutable data aggregate" 那么记录会很好,因为:

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

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

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

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