构建者模式:模型成员应何时成为最终成员?

问题描述

构建器模式是最受欢迎的创建模式之一,它具有许多优点。我特别想了解模型对象本身的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值:坦率地说,我不必经常使用不变性,在我的开发领域,我真的无法想到到目前为止我已经使用过它。我唯一要使用的是标记不变的值,而我不想被任何东西更改。

最后,关于设计模式的整个讨论乏味。建设者只是一个帮助结构。您必须找到如何在用例和公司中使用它的方法。请仅提醒您一个事实,它的全部目的是使创建复杂对象的操作更加容易。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...