Java中构造函数中的多个可选参数 – 构造函数的指数

这是我遇到过几次,但还没有找到令人满意的答案。 这看起来很愚蠢,但谷歌搜索了一段时间后,我无法想出一些好的东西。

假设我有一个包含20个实例变量的类,每个变量都是可选的(将被初始化或不被初始化)。

现在我希望我的构造函数处理所有的情况,如果有一些实例变量它很好我可以创建具有不同签名的构造函数,但是这里我有20个,所以我需要2 ^ 20 = 1,048,576个构造函数处理所有案件! 那似乎……不是最优,你不同意吗?

因此,由于采用这种powershell方法,我基本上必须构造2 ^ n个构造函数,其中n是实例变量的数量,我想找到更好的方法来实现它。

我已经看到了这个问题的几个解决方案,但我相信它们都是关于数据的假设,但在我的情况下,这些变量中的每一个都可以初始化或不是随机的,我在初始化之前无法知道。

我正在寻找一些我可以应用的设计模式或想法,以使我的代码更加可维护(不用担心我没有创建1M +构造函数:)

谢谢。

将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; } ... } 
 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; } ... }