Answers:
生成器设计模式可能会有所帮助。考虑以下示例
public class StudentBuilder
{
private String _name;
private int _age = 14; // this has a default
private String _motto = ""; // most students don't have one
public StudentBuilder() { }
public Student buildStudent()
{
return new Student(_name, _age, _motto);
}
public StudentBuilder name(String _name)
{
this._name = _name;
return this;
}
public StudentBuilder age(int _age)
{
this._age = _age;
return this;
}
public StudentBuilder motto(String _motto)
{
this._motto = _motto;
return this;
}
}
这让我们编写如下代码
Student s1 = new StudentBuilder().name("Eli").buildStudent();
Student s2 = new StudentBuilder()
.name("Spicoli")
.age(16)
.motto("Aloha, Mr Hand")
.buildStudent();
如果我们省略必填字段(可能是必填名称),则可以让Student构造函数引发异常。而且它使我们可以使用默认/可选参数,而无需跟踪任何类型的参数顺序,因为这些调用的任何顺序都可以很好地工作。
buildStudent()方法引发了异常。
您可以将相关参数封装在对象中吗?
例如,如果参数像
MyClass(String house, String street, String town, String postcode, String country, int foo, double bar) {
super(String house, String street, String town, String postcode, String country);
this.foo = foo;
this.bar = bar;
那么您可以改为:
MyClass(Address homeAddress, int foo, double bar) {
super(homeAddress);
this.foo = foo;
this.bar = bar;
}
您可能想要做的是拥有一个Builder类。然后,您将执行以下操作:
MyObject obj = new MyObjectBuilder().setXxx(myXxx)
.setYyy(myYyy)
.setZzz(myZzz)
// ... etc.
.build();
请参阅第8页和此Josh Bloch演示文稿(PDF)或以下内容,或对有效Java的这篇评论
好吧,使用构建器模式可能是一种解决方案。
但是一旦您获得20到30个参数,我就会猜到这些参数之间有很高的关系。因此(如建议的那样)将它们包装成逻辑上合理的数据对象可能是最有意义的。这样,数据对象已经可以检查参数之间约束的有效性。
对于过去的所有项目,一旦我发现参数太多(即8个而不是28个!),便可以通过创建更好的数据模型来清理代码。
我真的可以建议在使用构建器模式时使用Immutables或POJOBuilder。
我几乎可以想到所有减少重构的参数以减少继承层次结构的参数数量和深度,因为实际上并没有什么办法可以使20多个参数保持一致。在查看文档时,您将只需要进行每个调用。
您可以做的一件事是将一些按逻辑分组的参数分组到它们自己的高级对象中,但这有其自身的问题。