web-dev-qa-db-ja.com

パラメータ付きまたはパラメータなしのコンストラクタがある方が良いですか?

パラメータの有無にかかわらずコンストラクタを持つ方が良いですか、そしてなぜですか?

public NewClass( String a,  String b, int c) throws IOException
{
    //something
}

[〜#〜]または[〜#〜]

public NewClass() 
{
    //something
}
5
user208372

コンストラクターは、オブジェクトの初期不変式を確立する必要があります。つまり、オブジェクトを有効で使用可能な状態にします。

オブジェクトが作成後の型のインスタンスとして実際に使用できない場合は、オブジェクトの初期化とオブジェクトの使用の間に少し汚れがあることを示しています。

オブジェクトを適切に構築するために事前に必要なすべての情報を提供することが不可能な場合は、オブジェクトをインスタンス化する前に段階的に状態を収集するなんらかのビルダーを検討する必要があります。

一般に、構築後に初期化され、破棄される前に無効化されるゾンビタイプのオブジェクトは、特にそれに対する言語サポートがない場合、エラーが発生しやすく、ドキュメントやアサーションに概念を適用する必要があります。

21
Lars Viklund

パラメータなしのコンストラクタを優先する必要があります。

これには主に2つの理由があります。1つ目は、コンストラクターがエラーを報告する適切な方法がないことです。確かに、例外を投げることはできますが、それは単純な不良データに対するかなり大きな影響です。オブジェクトのユーザーは、作成によってスローされる可能性があるため、過度の注意を払って処理する必要があります。

2つ目は、(一部の言語では特に)コンストラクターの設定とプロパティの設定の検証の間に切断(または重複したコード)が発生し、不変性が適用される場合があることです。クラスの不変条件は同じであるため、検証は同じでなければなりません。値を設定する2つの効果的な方法を許可することにより、クラスの検証を複雑にします。

明確にするために、パラメーター化されたコンストラクターを決して持たないと言っているのではありません。そして、私はいくつかの初期化メソッドを持っていると言っているのは間違いありません。私が言っているのは、オブジェクトは明確でデフォルトのある明確で明確な初期状態を持つべきだということです。

時々、オブジェクトは正しいデフォルトを持つことができず、代わりにそれらに初期状態を渡す必要があります。それが起こります。しかし、一般的には、それを避けるように注意する必要があります。

0
Telastyn

私はパラメーター付きのコンストラクターを好みますが、2つの主な理由があります。

  • コンストラクターに値を渡すことは、フィールドがfinalになる可能性があるため、検証および設定が1回のみであることを意味します。 finalフィールドを使用すると、マルチスレッドのコーディングがはるかに簡単になります( http://www.Amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601 を参照)。
  • コンストラクターを介して渡された値(特にオブジェクト)をモックして希望どおりに動作させることができれば、テストがはるかに簡単になります。単独でのテストに役立ちます。

ゲッターセッターに問題はないと思いますが、通常は「ビルダー」または「Bean」クラスでのみ使用します。

0
cyber-monk