2012-04-15 25 views
2

これは私が数回遭遇したもので、まだ満足のいく答えを見つけることができませんでした。これはかなりばかげているようだが、しばらくの間これをグーグルで見つけた後、何か良いものを考え出すことができなかった。Javaのコンストラクタで複数のオプションの引数 - 指数関数のコンストラクタ数

私は20のインスタンス変数を持つクラスを持っているとしましょう。それぞれはオプションです(初期化されるかどうか)。

今私は、いくつかのインスタンス変数がある場合はすべてのケースを処理したいと思うし、別のシグネチャを持つコンストラクタを作成することもできますが、ここでは20が必要です。2^20 = 1,048,576すべてのケースを処理するコンストラクタ!それは...非常に最適ではないようです、あなたは同意しますか?

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

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

私はいくつかのデザインパターンや、私はもう少し私のコードを作るために適用できるアイデアを探しています...(保守性なしには、私は1M +コンストラクタ:)

感謝を作成していない心配しないでください。

+1

豆のパターン。コンストラクターには引数はなく、すべてのパラメーターはセッターを介して入ります。 – bmargulies

+1

私は20のインスタンス変数を持っていると言っていましたが、実際には私はもっとたくさん持っています。私は20人のセッターに電話したくありません!途中で矛盾した状態になっている可能性がありますが、これは非常に悪い解決策のようです。 –

+0

これはまた私のクラスを不変にすることを禁じます。 –

答えて

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; 
    } 
    ... 
} 
+0

私が上記のコメントで述べたように、このような問題やアプローチは、私のオブジェクトが途中で途切れた状態になることがあります。それは私のケースでは非常に危険であり、私はそれを本当に行うことはできません。そして、クラスを変更可能にする必要があります。これは、私が欲しくないものです。 –

+0

@linkerオブジェクトの作成が途中で途切れた状態になるのは、オブジェクトの作成が完了する前に他のメソッドに渡す場合だけです。変更可能性について心配する必要がある場合は、フラグを作成してフィールドが設定可能かどうかを判断し、オブジェクトの作成が完了したらそれを切り替えることができます。 – Jeffrey

+0

私はマルチスレッドの状況でもっと話していました。ビルドが完了する前にオブジェクトにアクセスしないようにすることはできますが、スレッドの安全性を確保するためには余分な努力が必要です。 –

4

を。 YourObjectの構築の途中で矛盾した状態になることはありませんが、それでも20以上の操作が必要となり、YourObjectBuilderではなくYourObjectを不変(必要な場合)にすることができます。

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; 
    } 
    ... 
} 
+0

ビーンのパターンよりいい解決策と方法のように聞こえるよ、ありがとう! –

+0

+1 - これはIntelliJの機能です。 – duffymo

関連する問題