首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 16中的记录特性是构建器类的替代方法吗?

Java 16中的记录特性是构建器类的替代方法吗?
EN

Stack Overflow用户
提问于 2021-08-19 00:45:57
回答 2查看 7.3K关注 0票数 0

记录为对象提供不可变性,构建器模式也是如此。

使用记录代替建造者的利弊是什么?

EN

回答 2

Stack Overflow用户

发布于 2021-08-19 02:16:19

是Java16中的记录特性,是构建器类的替代品吗?

基本上..。不不是。

记录为对象提供了不可变性,构建器模式也是如此。

这不对。生成器模式既可以应用于不可变对象,也可以应用于可变对象。它实际上是关于对象是如何创建的,而不是对象本身的性质。

使用记录代替构建器的利弊是什么?

简单地说,你不能用记录来代替建造者模式.因为他们所做的事情(事实上,正交的)是不同的。下面是用构建器模式实现的传统Java类与record类型的逐点比较:

created

  • record

  • 可变异性:
  • 类+构建器--无论是可变的还是不可变的对象都可以是-不变的

  • 验证:
    • 类+构建器-是的.构建器可以递增地或在method.
    • record build()中验证参数-是的.在constructors

  • 支持可选参数:
    • 类+构建器-是的
    • 记录-不.虽然您可以实现重载的constructors

  • 支持extends
    • 类+生成器-是的
    • 记录-不.虽然您可以使用继承的interface.

中的default方法

no

  • 支持内部状态/抽象:
  • 类+ builder - yes
  • record -

少样本代码: records).

  • record

  • 类+ builder -是的(相对于没有构建器实现的类)和no (相对于- yes

)

“较少的样板”问题是微妙的。一方面,构建器避免了对具有大量参数的重载构造函数或new调用的需求。(但你需要实现建筑商本身.主要是样板。)另一方面,record可以在没有任何显式方法和没有主体的简单记录构造函数的情况下实现。

票数 11
EN

Stack Overflow用户

发布于 2021-08-19 01:12:42

JDK增强建议将记录描述为“充当不可变数据透明载体的类”。

用例:

减少了样板代码:从历史上看,在中创建不可变的对象是相当痛苦的工作,记录为我们处理几乎所有的工作。通过减少样板代码,记录还允许类更好地关注手头的业务问题。这使得它成为实现DDD样式的值对象和域事件之类的一个引人注目的特性。

代码语言:javascript
复制
public record Address(String street, String postCode, String town, String country) {
}

临时数据容器:记录不仅可以定义为独立类,还可以定义为方法中的本地类。这使得它们在数据处理过程中作为临时容器非常有用,可以在测试中快速创建临时模拟数据,我们将在下面看到一个示例。

数据验证:记录为不同的验证提供支持。它减少了开发人员编写此类验证的责任。

代码语言:javascript
复制
@NonNull -> a field can not be null.      
@Min() -> a min value that a field can hold.  
@Max() -> a max value that a field can hold.
@GreaterThanZero -> a field can not have value less than or equal to zero.

与Builder类的比较:记录类比构建器类提供的唯一优势是数据验证。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68840772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档