这是我几次遇到的事情,但还未能找到令人满意的答案。这看起来很愚蠢,但谷歌搜索了一段时间之后,我无法想出一些好的东西。
假设我有一个包含20个实例变量的类,每个变量都是可选的(将被初始化或不被初始化)。
现在我希望我的构造函数处理所有情况,如果有几个实例变量就可以了,我可以创建具有不同签名的构造函数,但是这里我有20个,所以我需要 2 ^ 20 = 1,048,576 构造函数来处理所有情况!这似乎......不是最优,你不同意吗?
因此,由于采用这种强力方法,我基本上必须构造2 ^ n个构造函数,其中n是实例变量的数量,我想找到更好的方法来实现它。
我已经看到了这个问题的几个解决方案,但我相信它们都是关于数据的假设,但在我的情况下,这些变量中的每一个都可以初始化或不是随机的,我在初始化之前无法知道
我正在寻找一些我可以应用的设计模式或想法,以使我的代码更加可维护(不用担心我没有创建1M +构造函数:)。
感谢。
答案 0 :(得分:7)
答案 1 :(得分:5)
将Bean模式与Builder结合使用。 YourObject在构造中途不会有不一致的状态,但它仍然需要20多个set操作,你可以使YourObject不可变(如果你想) - 但不是YourObjectBuilder。
public class YourObject {
private Type field1;
private Type field2;
private Type field3;
...
YourObject ( Type field1 , Type field2 , Type field3 ... ) { }
}
public class YourObjectBuilder {
private Type field1;
private Type field2;
private Type field3;
...
public YourObjectBuilder() {
}
public YourObject make ( ) {
return new YourObject ( field1 , field2 , field3 ... ) ;
}
public void setField1(Type t) {
field1 = t;
}
public void setField2(Type t) {
field2 = t;
}
public void setField3(Type t) {
field3 = t;
}
...
}
答案 2 :(得分:0)
public class YourObject {
private Type field1;
private Type field2;
private Type field3;
...
public YourObject() {
}
public void setField1(Type t) {
field1 = t;
}
public void setField2(Type t) {
field2 = t;
}
public void setField3(Type t) {
field3 = t;
}
...
}