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

时间:2012-04-15 02:03:50

标签: java design-patterns constructor

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

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

现在我希望我的构造函数处理所有情况,如果有几个实例变量就可以了,我可以创建具有不同签名的构造函数,但是这里我有20个,所以我需要 2 ^ 20 = 1,048,576 构造函数来处理所有情况!这似乎......不是最优,你不同意吗?

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

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

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

感谢。

3 个答案:

答案 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;
    }
    ...
}