2

これは私が数回遭遇したものであり、満足のいく答えをまだ見つけることができていません。これはかなりばかげているように見えますが、しばらくこれをグーグルした後、私は何か良いものを思い付くことができませんでした。

20個のインスタンス変数を持つクラスがあり、それぞれがオプションであるとしましょう(初期化されるかどうかは関係ありません)。

ここで、コンストラクターですべてのケースを処理する必要があります。インスタンス変数がいくつかある場合は問題なく、異なるシグネチャでコンストラクターを作成できますが、ここでは20個あるため、2 ^ 20=1,048,576個のコンストラクターが必要になります。すべてのケースを処理します!それは...あまり最適ではないようです、あなたは同意しませんか?

したがって、このブルートフォースアプローチでは、基本的に2 ^ n個のコンストラクターを作成する必要があるため、nはインスタンス変数の数であるため、より良い方法を見つけたいと思います。

この問題の解決策をいくつか見てきましたが、それらはすべてデータの仮定に基づいていると思いますが、私の場合、これらの変数はそれぞれ初期化できるか、ランダムではないので、初期化する前にそれを知る方法がありません。

コードをもう少し...保守しやすくするために適用できるデザインパターンやアイデアを探しています(100万以上のコンストラクターを作成しなかったので心配しないでください:)

ありがとう。

4

3 に答える 3

7

Builderパターンを試してください:

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

于 2012-04-15T02:12:11.437 に答える
5

Beanパターンをビルダーと組み合わせます。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 に答える