Java 生成器模式:模型成员何时应为最终成员?

Java 生成器模式:模型成员何时应为最终成员?,java,design-patterns,builder,Java,Design Patterns,Builder,builder模式是最流行的创建模式之一,它有许多好处。我特别想了解模型对象本身的不可变性是否是关键优势之一。虽然我一直认为是这样,但我找不到任何支持文档。考虑这个场景,你正在从一个网络调用中创建一个对象(从JSON让我们说)。我们创建模型对象,它有一个内嵌的生成器。这是每个人都做的事。模型的成员也是私有的。由于这是一个网络对象,因此成员将不会有设置器。我的怀疑是 使用builder保护对象创建,我们是否需要使成员私有化 我们是否可以保留它们public final,并且不再需要getter(

builder模式是最流行的创建模式之一,它有许多好处。我特别想了解模型对象本身的
不可变性
是否是关键优势之一。虽然我一直认为是这样,但我找不到任何支持文档。考虑这个场景,你正在从一个网络调用中创建一个对象(从JSON让我们说)。我们创建模型对象,它有一个内嵌的生成器。这是每个人都做的事。模型的成员也是私有的。由于这是一个网络对象,因此成员将不会有
设置器
。我的怀疑是

  • 使用builder保护对象创建,我们是否需要使成员
    私有化
  • 我们是否可以保留它们
    public final
    ,并且不再需要
    getter()
  • 一般来说(不管以上两点如何),所有不可设置的成员不都应该是final吗?我没有看到很多人最终成为会员,为什么会这样? 这是不是一个好办法

我对你选择的例子感到非常痛苦。现在,将JSON解析为对象确实是可以委托给JSON-B/Jackson/insert JSON库的事情。但我知道我们在理论层面上

Wikipedia只是说:
构建器设计模式的目的是将复杂对象的构造与其表示分离开来

从理论上讲,构建器模式既不强制实现不变性,也不是它的任何方面

使用builder保护对象创建,我们需要创建成员吗 私人的

你不需要做任何事。但有一个简单的风格规则:要么通过getter和setter访问成员,要么将其公开。但不是两者都有

我们能让他们公开最终结果并消除对getter()的需求吗

Final意味着不变性——如果这是您想要实现的,那么您可以这样做

总的来说(不管以上两点),不应该 不可设置的成员是否为最终成员?我没有看到很多人成为会员 最后,为什么会这样?这是不是一个好办法

仅当希望成员不可变或为常量时,才将其设为最终成员。否则就没有意义了。以你为例,我只能想到常量值?但是,如果不设置成员的值,则无法使成员成为最终成员。您需要在构造函数中设置它们,或者将它们初始化为
null
。但是拥有
最终空值
很可能没有任何作用

对于这样的值,更好的方法实际上是不定义getter或setter并将其私有化。但是,您的类中仍然存在一些无用的空值

坦率地说,关于成功者/成功者或公众的讨论正在打开潘多拉的盒子。到目前为止,我已经对此进行了太多的讨论,你用哪种方式来做都无关紧要。最终,这两种方法都有相同的用途:设置和检索值

关于
final
值:坦率地说,我不必经常使用不变性,在我的开发领域,到目前为止,我真的想不出我使用过它的任何案例。我唯一使用它的目的是标记常量值,我不想被任何东西改变


最后,关于设计模式的整个讨论是乏味的。建筑工人只是一个辅助结构。您必须找到如何在您的用例和公司中使用它的方法。只是提醒您,它的全部目的是使复杂对象的创建更容易访问。

JSON是一个松散的示例。我试图指出的一点是,当模型保存来自外部源的信息时(不应该变异和丢失)。在这些场景中,不变性显然很重要。我在那个团队中特别谈到了如何以正确的方式使用Builder。此外,关于成员不是最终决定的问题,作为一种普遍的良好做法,我宣布所有事情都是最终决定的,如果需要的话,将其降级。这是为了避免下游错误,这些错误可能会无意中更改变量的值。最终!=常数我可以保留一个变量final并在构造函数上初始化它。我发现这是一个很好的实践,可以让所有的东西都是不变的,并且使所需的东西是可变的,这使得代码不太容易受到下游意外值替换的影响。