0

所以想象一下我们有这样的情况:

public class Bar1 {
    public final int VALUE1; 
    public final double VALUE2;
    public final String NAME; 
    /*DOZENS OF FINALS!*/

    public Bar1(int v1, double v2, String name)
    {
        this.VALUE1 = v1; 
        this.VALUE2 = v2;
        this.NAME = name; 
    }

}

public class Foo1
{
    private Bar1 bar1;
    private Bar1 bar2;
    private Bar1 bar3;
    /*Dozens of bars!*/

    public Foo1( //We need to pass the values in here)
                 {
                     bar1 = new Bar1( //we need to initialise each of the bars. )
                     bar2 =...
                     bar3 = ...
                 }


}

这样做的好方法是什么?我认为将每一个都作为自己的论点传递,

例如:

public class Foo1
{
    private Bar1 bar1;
    private Bar1 bar2;
    private Bar1 bar3;
    /*Dozens of bars!*/

    public Foo1(int bar1Value1, double bar1Value2, String bar1String, 
                        int bar2Value1, double bar2Value2, String bar2String,
                        int bar3Value1, double bar3Value2, String bar3String)
                 {
                     bar1 = new Bar1(bar1Value1, bar1Value2, bar1String);
                     bar2 = new Bar1(bar2Value1, bar2Value2, bar2String);
                     bar3 = new Bar1(bar3Value1, bar3Value2, bar3String);
                 }


}

是一个巨大的痛苦。

我将发布我提出的解决方案,但我想知道还有哪些其他解决方案。

4

2 回答 2

2

分离出你的类型。如果您有几十个字段,则几乎可以肯定:

  • 其中一些字段是相互关联的,因此应该以它们自己的类型捕获,例如,如果您有 fields address1, address2, address3, city,state那么它应该是一个Address类型

  • 有些字段根本不相关,并且不应该在同一类型中开始

我从来没有见过一个精心设计的有几十个字段的类。

一旦你减少了字段的数量,你就不会遇到笨拙的构造函数的问题。

如果您仍然有很多字段,那么构建器模式(如评论中所述)确实很好,但有点乏味:有一个可变构建器类型(通常是嵌套类型),然后是一个build()将构建器本身传递给的方法不可变类型的构造函数,它将构建器中的值复制到最终字段中。

于 2012-11-13T21:53:27.173 回答
0

我的解决方案。将值作为二维字符串数组传入,并将每个字符串转换为其对应的类型。

public class Foo1
{
    private Bar1 bar1;
    private Bar1 bar2;
    private Bar1 bar3;

    public Foo1(String[][] values)
    {
        Bar1[] bars = {bar1, bar2, bar3};

        for (int i = 0; i<3; i++)
        {
            bars[i] = new Bar1(Integer.parseInt(values[i][0]), Double.parseDouble(values[i][1]), values[i][2]); 

        }


    }

}




public class FooBar1 {

    private static final String[][] myFoo1Values = {
            //Value1, Value2, Name
            //Integer, Double, String
            {"1", "2.22", "bar 1"},
            {"2", "5.59", "BAR TWO"},
            {"333", "2", "- tre"}
    };

    static private Foo1 myFoo1; 

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        myFoo1 = new Foo1(myFoo1Values);

    }

}
于 2012-11-13T21:47:56.203 回答