0

Fooint x と int y の 2 つのインスタンス変数を持つクラスを想定してみましょう。ユースケースでは、なし、単一、またはすべてのパラメーターを使用してクラスを構築できることが要求されます。

input X    input Y

  0         0           no constuctor

  0          1          public Foo(int x);

  1          0          public Foo(int y);

  1          1          public Foo(int x, int y);

この場合の規則/ベストプラクティスは何ですか。コンストラクターの順列をすべて追加する必要がありますか? もしそうなら、それは指数関数的な成長をもたらすでしょう。いいえの場合、解決策は何ですか?

4

5 に答える 5

7

あなたの最善の策は、次のようにビルダーパターンを使用することです

new FooBuilder().build()   // Uses default values for both parameters

new FooBuilder().setX(42).build()  // Uses default value for y

new FooBuilder().setY(-13).build()  // Uses default value for x

new FooBuilder().setX(42).setY(-13).build()  // Supplied values for both

そして、ビルダーは次のようになります

class FooBuilder {
  public Foo build() { return new Foo(...); }
  public FooBuilder setX(int x) { ...; return this; }
  public FooBuilder setY(int y) { ...; return this; }
}
于 2013-09-30T03:10:55.297 に答える
2

簡単な答え: 場合によります。

より長い答え: 実際のユースケースに対応するものを追加してください。それがすべてのパラメーターを含むもの、または何も含まないもの (パラメーターのデフォルトを設定する) を意味する場合は、素晴らしいことです。一部のパラメーターをデフォルトに設定し、一部をデフォルトに設定しない一般的なユースケースがある場合は、そのためのコンストラクターを提供します。

パラメーターの順序、数、および型が同じコンストラクターを複数持つことはできないことに注意してください。

于 2013-09-30T03:10:35.457 に答える
0

オブジェクトのリスト/配列を受け入れるコンストラクターを用意します。コンストラクターでそれを繰り返し、必要に応じて値を設定します。クラスで利用可能なすべてのフィールドにセッターがあると仮定しています。

長所:異なるコンストラクタを書く必要はありません

短所:リスト/配列内のインデックスまたは位置が設定するフィールドを決定することを知って理解する必要があります。

Foo (Object[] args){
this.setX(args[0]); // have null check accordingly
this.setY(args[1]);    
}
于 2013-09-30T03:23:18.810 に答える