龙目岛 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" 那么记录会很好,因为:
- 它甚至比 class 用 Lombok 注释
的仪式更少
- 它带有语义信息“这是一个不可变的数据class”(正如 Brian Goetz 的回答中强调的那样)。这种语义信息可能对程序员和框架都很有价值。
如果您的 class 不能忍受记录的限制(例如不变性、无构建器、不可扩展),我仍然会使用 Lombok。
简而言之,如果您使用 Java 进行功能编码,请使用记录。否则使用Lombok,它更加灵活和强大。
此规则有一些例外情况,例如在 API 编码中。
我喜欢 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" 那么记录会很好,因为:
- 它甚至比 class 用 Lombok 注释 的仪式更少
- 它带有语义信息“这是一个不可变的数据class”(正如 Brian Goetz 的回答中强调的那样)。这种语义信息可能对程序员和框架都很有价值。
如果您的 class 不能忍受记录的限制(例如不变性、无构建器、不可扩展),我仍然会使用 Lombok。
简而言之,如果您使用 Java 进行功能编码,请使用记录。否则使用Lombok,它更加灵活和强大。
此规则有一些例外情况,例如在 API 编码中。