问题描述
构建器模式是最受欢迎的创建模式之一,它具有许多优点。我特别想了解模型对象本身的immutability
是否是主要优点之一。我一直以为是,但是我找不到相同的任何支持文档。考虑这种情况,您正在通过网络调用(假设是json)创建对象。我们创建模型对象,并且有一个内联的Builder。这就是每个人都在做的。模型的成员也是private
。由于这是一个网络对象,因此成员将没有setters
。我的疑问是
- 使用生成器保护对象创建时,我们是否需要使成员成为
private
。 - 我们是否可以保留它们
public final
并消除对getter()
的需求 - 通常(与以上两点无关),不是所有不可设置的成员都不应该是
final
吗?我看不到有多少人将成员定为决赛,为什么会这样呢? 这是一个好方法吗?
解决方法
对于您选择的示例,我真的很痛苦。如今,实际上可以将JSON解析为对象的事情可以委托给JSON-B / Jackson / 在此处插入JSON库。但我知道我们处于理论水平。
维基百科只是说:The intent of the Builder design pattern is to separate the construction of a complex object from its representation
。
从理论上讲,构建器模式既不会强制不变性,也不是它的任何方面。
使用生成器来确保对象创建时,是否需要使成员成为成员 私人的。
您无需执行任何操作。但是,有一个简单的样式规则:您可以通过getter和setter或将其公开来访问成员。但不是两个。
我们可以改为将它们保留为公共最终结果,并消除对getter()的需求
最终将暗示不变性-如果那是您想要实现的目标,则可以做到。
通常(与以上两点无关),不应该全部 不可固定的成员是最终成员吗?我没有看到很多人成为会员 最后,为什么会这样呢?这是一个好方法吗?
仅当您希望成员不可变或它们是常量时,才使成员成为最终成员。否则,这是没有意义的。以您的示例为例,我只能想到常量值吗?但是,如果不设置成员值,则不能使成员最终身份。您要么需要在构造函数中设置它们,要么将它们初始化为null
。但是拥有final null
值很可能毫无用处。
获取这些值的更好方法实际上就是不定义getter或setter并将其私有化。但是然后您又在类中放置了一些无用的null值。
坦率地说,关于吸气剂/吸气剂或公众的整个讨论正在打开Pandora的盒子。到目前为止,我对此已经进行了过多的讨论,无论采用哪种方式都无关紧要。最终,两者都具有相同的目的:设置和检索值。
关于final
值:坦率地说,我不必经常使用不变性,在我的开发领域,我真的无法想到到目前为止我已经使用过它。我唯一要使用的是标记不变的值,而我不想被任何东西更改。
最后,关于设计模式的整个讨论乏味。建设者只是一个帮助结构。您必须找到如何在用例和公司中使用它的方法。请仅提醒您一个事实,它的全部目的是使创建复杂对象的操作更加容易。