建造建筑师时哪种方法更有效?

6
注意:所有的构建器都只适用于单元测试。
我一直在创建构建器,但是我注意到一些其他已存在的构建器遵循了不同的模式。想问一下哪种方式更有效。
我的做法如下:
public class Builder
{
    public Builders()
    {
        SetDefaults();
    }

    private void SetDefaults()
    {
       // Setting my defaults
    }
}

另外一种已经存在的方式是:
public class Builder
{     
    public Builder WithDefaults()
    {
       // Setting my defaults
    }
}

在我看来,第一个方法更加有效,因为你只需要创建生成器,它会自动为你进行默认设置。
而在另一种情况下,你必须显式调用WithDefaults方法,在继续构建之前设置所有默认值。
第二种方法似乎更容易出现错误,因为一些需要构建的对象如果没有设置完所有字段,可能会抛出空异常。
也许我在这里忽略了一些微妙的东西,所以我决定问你哪个方法更有效。
谢谢。

5
如果你必须调用"WithDefaults",那么它们不是真正的默认值,对吗? - Jon Skeet
@JonSkeet 非常好的观点,谢谢! - AvetisCodes
如果我真的想为第二种方法找到一个专业人士,那就是这个:WithDefault仍然可以用来将构建器属性重置为它们的默认值... - Irwene
1个回答

0

我想提出第三个选项。由于构建器应该通过以清晰明了的方式删除对象初始化来减少测试代码的数量,为什么要声明您正在使用默认值呢? 它本身并没有告诉我们实际的默认值是什么,而且您有可能会忘记调用“WithDefaults”。

请参阅此帖子的示例

相反,使用构造函数设置默认值(存储它们的字段),只有在明确要求时才更改它们。 这样,您就可以获得一个经过初始化的对象,并进行最少和有意义的构建器调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接