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

タイプを分けてください。数十のフィールドがある場合、次のいずれかであることはほぼ確実です。

  • これらのフィールドの一部は相互に関連しているため、独自のタイプでキャプチャする必要があります。たとえば、フィールド、、、、がある場合は、address1それをタイプにする必要があります。address2address3citystateAddress

  • 一部のフィールドはまったく関連していないため、最初から同じタイプである必要はありません。

何十ものフィールドを持つうまく設計されたクラスを見たことがありません。

フィールドの数を減らしたら、扱いにくいコンストラクターで問題が発生することはありません。

まだ多くのフィールドがある場合、(コメントで述べたように)ビルダーパターンは確かに良いですが、少し退屈です:可変のビルダータイプ(多くの場合ネストされたタイプ)を持ち、次にビルダー自体build()をに渡すメソッドを持っていますビルダーから最終フィールドに値をコピーする不変型のコンストラクター。

于 2012-11-13T21:53:27.173 に答える
0

私の解決策。値を文字列の2次元配列として渡し、各文字列を対応するタイプに変換します。

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 に答える