构造函数参数 - 经验法则
2022-09-01 21:38:49
通常,类构造函数应接受的最大参数数是多少?我正在开发一个需要大量初始化数据(目前有10个参数)的类。但是,具有 10 个参数的构造函数感觉不对。这让我相信我应该为每条数据创建一个 getter/setter。不幸的是,getter/setter模式不会强迫用户输入数据,没有它,对象的特征是不完整的,因此是无用的。思潮?
通常,类构造函数应接受的最大参数数是多少?我正在开发一个需要大量初始化数据(目前有10个参数)的类。但是,具有 10 个参数的构造函数感觉不对。这让我相信我应该为每条数据创建一个 getter/setter。不幸的是,getter/setter模式不会强迫用户输入数据,没有它,对象的特征是不完整的,因此是无用的。思潮?
有了这么多参数,是时候考虑生成器模式了。创建一个包含所有这些 getter 和 setter 的生成器类,并使用 build() 方法返回您真正尝试构造的类的对象。
public class ReallyComplicatedClass {
private int int1;
private int int2;
private String str1;
private String str2;
// ... and so on
// Note that the constructor is private
private ReallyComplicatedClass(Builder builder) {
// set all those variables from the builder
}
public static class Builder {
private int int1;
private int int2;
private String str1;
private String str2;
// and so on
public Builder(/* required parameters here */) {
// set required parameters
}
public Builder int1(int newInt) {
int1 = newInt;
return this;
}
// ... setters for all optional parameters, all returning 'this'
public ReallyComplicatedClass build() {
return new ReallyComplicatedClass(this);
}
}
}
在客户端代码中:
ReallyComplicatedClass c = new ReallyComplicatedClass.Builder()
.int1(myInt1)
.str2(myStr2)
.build();
参见《Effective Java Reloaded 》第7-9页,Josh Bloch在JavaOne 2007上的演讲。(这也是有效Java第2版中的第2项,但我手头没有,所以我不能引用它。