0

fooクラスのオブジェクトがあるとしましょうFoo。クラスFooには、その子孫を特徴付けるフィールドがたくさんあるとしましょう。

フィールドが非常に多い場合は、Fooのコンストラクターを使用してすべてを初期化することをお勧めします。

Foo foo = new Foo(0, 12, 123, 2, 2, (and so on...));

または、使用するクラスのコンストラクターまたはメソッドでそれらを初期化しますfoo

Foo foo = new Foo();

public void initFoo() {
    foo.setX(1);
    foo.setY(3);
    foo.setH(3);
    (and so on...)
}
4

3 に答える 3

4

私はコンストラクターを介してすべてを行います。そうすれば、これを行うことを忘れて、部分的に構築されたオブジェクトになってしまうことを忘れることはできません。コンストラクターを使用すると、当然、不変オブジェクトが作成されます。これらは、(特にマルチスレッド環境で)それらの動作について推論できるという点で役立ちます。

これのフォローアップは、ビルダーパターンを使用することです。このシナリオでは、ビルダーコンポーネントにパラメーターを提供すると、ビルダーは不足しているパラメーターやオブジェクトの作成方法を決定できます。

例えば

FooBuilder fb = new FooBuilder();
fb.setX(1);
fb.setY(2);
// etc...
Foo f = fb.newInstance();

以上のことをすべて述べましたが、非常に多くのパラメーターを使用してオブジェクトを作成する必要がありますか?それは次のように聞こえます:

  1. オブジェクトがそれ自体でやりすぎている、または
  2. これらのパラメータは、他の意味のあるオブジェクトに組み合わせることができます(たとえばxy座標pointなど)。
于 2012-12-28T14:03:39.863 に答える
1

一般に、緩い結合のために最初のアプローチを使用することをお勧めします。クラスを初期化する必要のあるメンバーの数は関係ありません。
自明でないクラスの単体テストを書き始めるとすぐに、このアプローチが必要になり
ます。そこでは、それらのメンバーをモックする必要があります。

質問に関連する設計上の決定について詳しく知りたい場合は、依存性注入、単体テスト、制御の反転、および緩い結合に関する詳細情報をWebで参照してください。

于 2012-12-28T14:35:35.530 に答える
0

個人的には、2番目のバージョン、つまりsetX()、setY()などを使用してコンストラクターで初期化することを検討します。部分的に構築されたオブジェクトがなく、見た目もすっきりしているためです。

于 2012-12-28T14:04:58.083 に答える