2

这是我遇到过几次但还没有找到令人满意的答案的事情。这似乎很愚蠢,但在谷歌搜索了一段时间后,我想不出什么好东西。

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

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

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

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

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

谢谢。

4

3 回答 3

7

尝试建造者模式:

http://rwhansen.blogspot.com/2007/07/theres-builder-pattern-that-joshua.html

于 2012-04-15T02:12:11.437 回答
5

将 Bean 模式与 Builder 结合起来。YourObject 在其构造过程中不会出现不一致的状态,但仍需要 20 多个集合操作,并且您可以使 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;
    }
    ...
}
于 2012-04-15T02:15:25.580 回答
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;
    }
    ...
}
于 2012-04-15T02:09:00.003 回答