龙目岛 getter/setter vs Java 14 记录

2022-08-31 16:52:53

我喜欢龙目岛项目,但在这些日子里,我正在阅读并尝试java 14的一些新功能。

在新功能中,有一个 record 关键字,它允许创建一个已内置以下功能的类:构造函数、私有最终字段、访问器、等于/哈希代码、getters、toString 方法。

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

最好使用这个:

record Person (String name, String surname) {}

或者:

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

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


答案 1

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

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

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


答案 2

注意:除了那棵圣诞树的注释,你可以在课堂上使用。请注意,这将使类成为最终字段,并使所有字段既是私有的又是最终的,并且还为您提供了所有其他字段。这与记录很接近(它们也是最终的,里面的所有字段都是最终的)。@Value

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

一旦记录超出预览状态,它就会变得更加复杂。龙目岛更加灵活;您可以轻松地交换一些新的方面,而不必重写所有代码(例如,您可以向类中添加一个“extends”子句,而不必然后手写equals和hashCode方法;记录无法为您提供的东西)。龙目岛还为您提供了更多功能:例如,您可以通过添加注释来添加构建器;不是记录可以做的事情。@Builder

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

免责声明:我是龙目岛项目的核心贡献者。


推荐