Java16中的Record功能是否可以替代构建器类?
记录为对象提供了不变性,构建器模式也是如此。
使用记录代替构建器的优缺点是什么?
回答
Java 16 中的 Record 功能是否可以替代构建器类?
基本上......不,它不是。
记录为对象提供了不变性,构建器模式也是如此。
那不正确。构建器模式可以应用于不可变和可变对象。它实际上是关于对象是如何创建的,而不是对象本身的性质。
使用记录代替构建器的优缺点是什么?
好吧,简单地说,你不能用记录来代替构建器模式……因为它们做不同的(实际上是正交的)事情。这是使用构建器模式实现的传统 Java 类与record类型的逐点比较:
- 可变性:
- class + builder - 可以创建可变或不可变对象
- 记录 - 仅不可变
- 验证:
- 类 + 构建器 - 是的......构建器可以增量地或在
build()方法中验证参数。 - 记录 - 是的......在构造函数中
- 类 + 构建器 - 是的......构建器可以增量地或在
- 支持可选参数:
- 类 + 生成器 - 是
- 记录 - 不......虽然你可以实现重载的构造函数
- 支持
extends:- 类 + 生成器 - 是
- 记录 - 不......尽管您可以使用
default继承接口中的方法。
- 支持内部状态/抽象:
- 类 + 生成器 - 是
- 记录 - 没有
- 更少的样板代码:
- 类 + 构建器 - 是和否(相对于没有构建器实现的类)
- 记录 - 是
样板问题是微妙的。一方面,构建器避免了对重载构造函数或new具有大量参数的调用的需要。(但您需要实现构建器本身......这主要是样板。)另一方面, arecord可以在没有任何显式方法和没有主体的简单记录构造函数的情况下实现。