使用静态内部构建器类的好处


9

在编写公司代码准则的过程中,我发现自己建议使用来自Effective Java 的Builder模式,而不是伸缩式构造函数。

但是,经过更多考虑之后,肯定是一个更优雅的解决方案是只删除构建器类,并且还要删除带有可选参数的多余构造函数。

因此,只有一个带有必需参数的构造函数,正常的getter / setter和注释代码。实现时,只需创建yr对象的新实例,然后设置值即可。

我最初的想法是,好处是消除了关于哪些参数是可选的以及需要哪些参数的困惑;但是,真正的好处来自使用方法链接/流利接口。

当您创建许多新实例时,构建器模式会很有用,因为ide可以完成繁琐的工作,并且还有很多(15+)个可选参数。但是,值得花额外的时间编码静态内部类吗,您是否建议使用构建器,还是浪费时间?


Answers:


8

我倾向于遵循一种模式,即构造函数应提供创建有效一致的对象所需的所有必需值。对于可选值,我尝试考虑最常见的默认值是什么,以便尽可能少地使用setter。

如果我发现有很多可选值,或者有较大比例的可选值倾向于从其默认值更改,那么我将使用构建器模式(静态内部构建器或其他类似设计)。

Josh通常会提供相当不错的好建议-我喜欢他的最好的建议是来自于战from-他承认自己在设计Java的某些部分时犯了错误,Effective Java在某种程度上是他的“治愈”方法,因此说:-)


1
这没有说明为什么内部应该是静态的……
Jimmy Hoffa 2014年

不变性和无副作用也是一个目标。
Martijn Verburg 2014年

6

Josh Bloch的Builder模式与GoF Builder模式非常相似,它提供了一种创建具有大量默认数据的不可变对象的方法,而无需一长串链式构造函数。

如果“拥有一个带有必需参数的构造函数,即普通的getter / setter”,则您的对象将不再是不变的。即。您可以在实例化它后很长时间对其进行更改。

如果这对您来说不是问题,那么您根本就不需要构建器模式。如果有问题,则您的解决方案有缺陷。


我认为构建器模式与可变性无关,即使Wiki上的gof示例也是可变的... en.wikipedia.org/wiki/Builder_pattern#Java也是如此,该模式具有我在问题中概述的好处。
NimChimpsky

3
@NimChimpsky:是否可以使用Builder模式来创建可变对象没有问题。问题是,你应该吗?获取器和设置器已经存在了很长时间,对象可以是可变的,它们是一个完全可靠的解决方案,但是人们在创建不可变对象时遇到了一个普遍的问题:构造器的管理链无法管理。Builder是一种常见的解决方案,因此成为简化通信的一种模式。
pdr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.