正如@Platinum Azure 所说,这取决于。既然你还没有说有一个占主导地位的用例......
请记住,作为类设计师,我们是为客户程序员设计的。他们的代码对第三方来说有多清晰?他们怎么知道的意思
Foo foo = new Foo();
Foo foo2 = new Foo(2);
Foo foo23 = new Foo(2,3);
你希望他们遵循什么风格的代码?“everythingononeline”风格:
Foo foo = new Foo().setNumHeads(2).setNumLegs(3);
其中,当有很多东西要设置时,可以适应
Foo foo = new Foo()
.setNumHeads(2)
.setNumLegs(3);
还是传统的OO风格:
Foo foo = new Foo();
foo.setNumHeads(2)
foo.setNumLegs(3);
那么,你现在需要做多少工作呢?你需要一个建造者,还是很Foo
简单不需要(如上面的例子)?
另一种方法是提供默认值:
Foo foo = new Foo(Foo.DefaultNumHeads, Foo.DefaultNumLegs, Foo.DefaultNumTails);
int
它适用于一些参数,但如果默认值定义为s,则当有很多参数时可能容易出错。因此,您可以应用命名参数习语的变体。这是一些建议构建器的地方,如Java 中的 Named Parameter idiom或
Foo foo = new Foo(Foo.DefaultNumHeads, Foo.DefaultNumLegs, Foo.DefaultNumTails);
其中Foo.DefaultNumHeads
等被定义为final
对象。当你到达
Foo foo = new Foo(Foo.NumHeads(2), Foo.NumLegs(3), Foo.NumTails(5));
您正在Foo
.
生态系统中常见的构造函数是什么风格Foo
?如果其他类已经有类似的论点,那么也许也Foo
应该如此。
关于组合爆炸的要点取决于可以预期的变化Foo
。如果Foo
是一个没有经过深思熟虑的抽象,Foo
我们就会得到一个组合爆炸,我们会一次又一次地返回并改变,违反了开放/封闭原则。不要这样做。
所以,这取决于。