正如@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我们就会得到一个组合爆炸,我们会一次又一次地返回并改变,违反了开放/封闭原则。不要这样做。
所以,这取决于。