gpt4 book ai didi

java - 我应该为具有大量必需属性的类创建一个构建器吗

转载 作者:行者123 更新时间:2023-12-02 04:29:47 24 4
gpt4 key购买 nike

如果我有一个具有相当多属性的类,比如 10 个,所有这些属性都需要[非空或非可选]才能正确构造实体,那么实例化此类的最佳方法是什么?

  • 我应该创建一个没有参数构造函数的构建器吗?凋零所有属性并检查“非空”正在构造的实体的私有(private)构造函数

  • 我应该有一个包含所有 10 个参数的公共(public)构造函数并创建没有建筑商?

拥有构建器使客户端代码看起来更干净,而拥有所有参数的公共(public)构造函数传达了所有参数都是必需的消息[比如说,我用@javax.annotations.Nonnull注释所有参数注释]

我该如何决定?

例如,

/**
* PLEASE SET SOME VALUE FOR ALL THE ATTRIBUTES!
*/
Class A {

private final String a1;
...
private final TypeN an;

private A(Builder builder) {
// copy all all the parameters
this.a1 = builder.a1;
...
this.an = builder.an;

// null checks
Preconditions.checkNotNull(this.a1);
...
Preconditions.checkNotNull(this.an);
}

public static class Builder{
private String a1;
...
private TypeN an;

public Builder withA1(String a1) {
this.a1 = a1;
return this;
}

// other withers

public A build() {
return new A(this);
}
}
}

最佳答案

当然Builder是正确的选择。如果您在编写 Java 时书架上有一本书,那么它应该是 Josh Bloch 的 Effective Java 。在第二版中,他有一个静态构建器模式。

这样做还有两个此处未提及的原因:

  • 参数在构建器中是描述性的,而不只是传递 int,您有一个名为“weight”或“height”(无论什么)的构建器方法
  • 重点是它鼓励不变性

认为它只不过是语法糖的想法是荒谬的。如果您对所有 10 个参数都有一个 setter ,那么您就不是在进行面向对象:任何人都可以在其生命周期的任何时刻随意更改实例的任何内容。

关于java - 我应该为具有大量必需属性的类创建一个构建器吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31620781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com