コンストラクターをいつどのように使用する必要があるか
Foo bar = new Foo();そして、いつ、どのようにgetInstance()(静的ファクトリメソッド)を使用する必要がありますか
Foo bar = Foo.getInstance();
これら2つの違いは何ですか?私はいつもコンストラクターを使用していましたが、getInstance()代わりにいつ使用する必要がありますか?
コンストラクターをいつどのように使用する必要があるか
Foo bar = new Foo();
そして、いつ、どのようにgetInstance()(静的ファクトリメソッド)を使用する必要がありますか
Foo bar = Foo.getInstance();
これら2つの違いは何ですか?私はいつもコンストラクターを使用していましたが、getInstance()代わりにいつ使用する必要がありますか?
getInstance()、またはあなたがされているメソッドの書き込みと呼ばれるのgetInstance()?
Foo.newInstance()。これにより、名前を付ける必要があります。Foo.getInstance()クラスのシングルトンインスタンスを取得するための規則です。例を修正して、Foo.newInstance()代わりに使用する必要があります。
回答:
質問は実際にはコンストラクターと静的ファクトリメソッドに関するものだと思いますが、誰もがシングルトンに焦点を合わせているようです。
これは実際には項目1です。JoshuaBlochによるEffectiveJavaのコンストラクターでは なく、静的ファクトリメソッドを検討してください。
項目1:コンストラクターではなく静的ファクトリメソッドを検討する
クラスがクライアントにそれ自体のインスタンスを取得できるようにする通常の方法は、パブリックコンストラクターを提供することです。すべてのプログラマーのツールキットの一部である必要がある別の手法があります。クラスは、パブリック静的ファクトリメソッドを提供できます 。これは、クラスのインスタンスを返す単純な静的メソッドです。これは
Boolean(プリミティブ型のボックス化されたプリミティブクラスboolean)の簡単な例です。このメソッドは、ブールプリミティブ値をBooleanオブジェクト参照に変換し ます。public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; }静的ファクトリメソッドは 、デザインパターンのファクトリメソッドパターンと同じではないことに注意してください [Gamma95、p。107]。この項目で説明されている静的ファクトリメソッドには、デザインパターンに直接相当するものはありません。
クラスは、コンストラクターの代わりに、またはコンストラクターに加えて、静的ファクトリメソッドをクライアントに提供できます。パブリックコンストラクタの代わりに静的ファクトリメソッドを提供することには、長所と短所の両方があります。
利点(本を引用):
短所(まだ本を引用しています):
protectedサブクラス化を許可する必要がありますが、クライアントコードは、静的ファクトリメソッドを呼び出すのではなく、新しいオブジェクトを作成してそのコンストラクターを呼び出すことで実際の利点が得られますか?連鎖コンストラクター呼び出しは意味的にはインスタンスメソッドであるように見えますが、「ユニタライズされたオブジェクトを作成してそのコンストラクターを呼び出す」というシーケンスは、静的ファクトリメソッド呼び出しと意味的に同等です。
次の2つの質問を持っている:私は必要があるときに呼び出すgetInstance()方法、およびとき、私は必要があります作成するものを?
あなたがコールするかどうかを決定している場合getInstance()の方法、それは簡単です。クラスのドキュメントを読んで、いつ呼び出すべきかを確認する必要があります。例えば、NumberFormatコンストラクタを提供し、getInstance()方法。このgetInstance()メソッドは、ローカライズされたを提供しますNumberFormat。以下のためにCalendar、他方では、コンストラクタは保護されています。あなたはそれをgetInstance()手に入れるために電話しなければなりません。
getInstance()メソッドを作成するかどうかを決定する場合は、何を達成しようとしているのかを決定する必要があります。あなたはどちらかしていない人は、(あなたが作成しているあなたのコンストラクタを呼び出したいシングルトンまたは工場)、または(のように、あなたは気にしないNumberFormat彼らは、発信者の便宜のためにいくつかのオブジェクトを初期化しているところ、上記)。
短編小説?getInstance()独自のコードでメソッドを作成することについて心配する必要はありません。それらが役立つ時が来れば、あなたは知っているでしょう。そして、一般に、クラスのコンストラクターを呼び出すことができれば、クラスがgetInstance()メソッドを提供している場合でも、おそらくそれを行うことになっています。
getInstanceメソッドの使用法:
ただし、ほとんどの場合、オブジェクトは単純なPOJOであり、パブリックコンストラクターの使用が最も実用的で明白なソリューションです。
U1:別のクラスからのgetInstance
別のクラスのインスタンスを返すには:
public class FooFactory {
public static Foo getInstance() {
return new Foo();
}
}
NumberFormat.getInstanceメソッドは実際にのインスタンスを返すため、これを行いますDecimalFormat。
U2:シングルトンの問題
シングルトンパターンは、オブジェクト指向プログラミングの利点の多くを制限します。シングルトンには通常、プライベートコンストラクターがあるため、それらを拡張することはできません。getInstanceメソッドを介してアクセスし、インターフェイスを参照しないため、別の実装と交換することはできません。
両方を使用できる場合は、実装が不十分なシングルトンパターンのように聞こえます。
システム内にクラスのインスタンスを1つだけ持ち、コンストラクターをプライベートにする場合は、2番目のオプションを使用します。
最初のものを使用して、クラスの複数のオブジェクトを構築できるようにします。
しかし、あなたのクラスに両方の可能性を与えないでください。
シングルトンを使いすぎないように注意してください。システムにインスタンスが1つしかない場合にのみ使用してください。そうしないと、他のプロジェクトでクラスを再利用する可能性が制限されます。プロジェクトのどこからでもgetInstanceを呼び出せるのは興味深いことのように思えますが、実際にそのインスタンスを所有しているのは誰なのか、誰もいないのか、あるいはすべてなのかが不明確になります。プロジェクトにシングルトンがたくさんある場合は、システムの設計が不十分であることに間違いありません(通常)。シングルトンは注意して使用する必要があります。グローバル変数の場合と同じアドバイスが適用されます。