クラスを設計するとき、コンストラクターをパラメーターなしにするように努力する必要がありますか?
6 に答える
いいえ。コンストラクターはいくつでも持つことができ、必ずしもデフォルトのコンストラクターは必要ありません。コンストラクターは、クラスの目的に適している必要があります。これが唯一のベストプラクティスです。
これにはさまざまな考えがあります。JavaBeansパターンは、デフォルトのコンストラクターとゲッターおよびセッターがオブジェクトをファイナライズすることを想定しています。ただし、これにより、インスタンスが不安定な状態になる可能性があります(詳細については、JoshBlochによるEffectiveJavaを参照してください)。
コンストラクターパラメーターは、クラスのインスタンスを作成するために必要なインスタンスを提供する必要があるため、あらゆる形式の「魔法」を防ぎます(依存性注入とも呼ばれます)。
答えは「はい」でも「いいえ」でもありません。状況によって異なります。
final
多くの場合、パラメーター化されたコンストラクターは、不変( )値でオブジェクトを初期化するために使用されます。最初に頭に浮かぶのは、次の例です。
public class Car {
public Car(String chassisCode) {...}
public String getChassisCode();
public String getLicenseNumber() {...}
public void setLicenseNumber(String value) {...}
}
ナンバープレートの登録番号は車のライフサイクル中に変更される可能性があるため、get/setプロパティとして実装できます。代わりに、シャーシ登録コードは車ごとに一意であり、不変です。車はいつでもナンバープレートを変更できますが、シャーシ番号は不変であり、ナンバープレートまたは所有者が変更されるたびにドキュメントに登録されます。
その他の場合は、「デフォルト」のパラメーターなしコンストラクターを使用して、クラスの「デフォルト」の動作を取得することができます。例
public class LightSwitch {
private boolean state = false; //off
public LightSwitch() {}
public boolean getState();
public void setState(boolean value);
}
この場合、明示的にオンにしない限り、照明スイッチはオフになっていると見なされます。
いいえ、まったくありません。デフォルトまたは「引数なし」のコンストラクターは、多くの場合、クラスが持つと便利な機能ですが、唯一のコンストラクターとしてではなく、使用可能なコンストラクターの 1 つとしてのみ使用できます。構築中にオブジェクトの重要な不変条件を確立することは良いことであり、多くの場合、引数を持つコンストラクターはこれを達成するために必要な部分です。
私はノーと言うでしょう。依存関係の挿入などの分離メカニズムを使用する場合、コンストラクターのパラメーターは、不変の依存関係を定義するのに最適な場所です。同様に、オブジェクトのその他の不変パラメーターは、コンストラクターに入れる必要があります。