[解決済み] コンストラクタとgetInstance()メソッド(静的ファクトリメソッド)はいつ使うのか?
質問
-
いつ、どのようにコンストラクタを使用すればよいのでしょうか?
Foo bar = new Foo();
-
また、いつ、どのようにgetInstance()(静的ファクトリーメソッド)を使えばいいのか
Foo bar = Foo.getInstance();
この2つの違いは何でしょうか?私はいつもコンストラクタを使用していますが、どのような場合に
getInstance()
を使うべきでしょうか?
どのように解決するのですか?
みんなシングルトーンに注目しているようですが、私は、この問題は実際には コンストラクタと静的ファクトリ メソッドの比較 .
これは実際には 項目1: コンストラクタの代わりに静的ファクトリメソッドを考える の 効果的なJava ジョシュア・ブロッホ著。
<ブロッククオート項目 1: コンストラクタの代わりに静的ファクトリメソッドを考慮する
通常、クラスは
クライアントが自分自身のインスタンスを取得するための
は、パブリック コンストラクタを提供することです。
もうひとつ、すべてのプログラマが知っておくべき
すべてのプログラマのツールキットの一部であるべき
もうひとつ、すべてのプログラマのツールキットの一部となるべきテクニックがあります。クラスはパブリックな
静的ファクトリーメソッド
これは、単にクラスのインスタンスを返す静的メソッドです。
これは単にクラスのインスタンスを返す静的メソッドです。以下は、簡単な
の例です。
Boolean
(箱型の
プリミティブ型クラス
boolean
). このメソッドは
ブール型のプリミティブ値を
Boolean
オブジェクトの参照に変換します。
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
静的なファクトリーメソッドは と同じではありません。 ファクトリーメソッド のパターンと同じです。 デザインパターン [Gamma95, p.107]を参照してください。この項目で説明した静的ファクトリー この項目で説明したメソッドは に直接相当するものはありません。 デザイン パターン .
クラスは、クライアントに 静的ファクトリーメソッドを提供することができます。 を提供することができます。 静的ファクトリーメソッドを提供することで パブリック コンストラクタの代わりに静的ファクトリ メソッドを提供することには メリットとデメリットの両方があります。
メリット(本を引用しています)。
- 静的ファクトリーメソッドの利点の1つは、コンストラクタとは異なり、名前を持つことです。
- 静的ファクトリーメソッドの2つ目の利点は、コンストラクタと異なり、呼び出されるたびに新しいオブジェクトを作成する必要がないことです。
- 静的ファクトリーメソッドの3つ目の利点は、コンストラクタとは異なり、その戻り値の型の任意のサブタイプのオブジェクトを返すことができることです。
- 静的ファクトリーメソッドの4つ目の利点は、パラメータ化された型インスタンスを作成する際の冗長性を減らすことができることです。
デメリット(まだ本を引用しています)。
- 静的なファクトリーメソッドのみを提供することの主な欠点は、以下のとおりです。 public または protected コンストラクタを持たないクラスはサブクラス化できないことです。
- 静的ファクトリーメソッドの第二の欠点は、他の静的メソッドと容易に区別できないことです。 他の静的メソッドと容易に区別がつかないことです。
関連
-
[解決済み] Java enumのメンバーを比較する:==またはequals()?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] StringBuilderとStringBufferの違いについて
-
[解決済み] java.lang.UnsupportedClassVersionError を修正する方法。サポートされていないメジャー.マイナーバージョン
-
[解決済み] Javaクラスにおけるcanonical name、simple name、class nameの違いは何ですか?
-
[解決済み] 静的メソッドを使用する場合
-
[解決済み] JDKとJREの違いは何ですか?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】静的なMapを初期化する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
型に解決できない エラー解決
-
メモ帳でJavaプログラムをコンパイルして実行すると、Could not find or load main class ...というエラーが表示される。解決方法
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
FindBugの使用概要
-
Web Project JavaでPropertiesファイルを読み込むと、「指定されたファイルがシステムで見つかりません」というソリューションが表示されます。
-
org.xml.sax.SAXParseExceptionのエラー解決方法
-
Java JDKのダイナミックプロキシ(AOP)の使用と実装の原理分析
-
1分でわかる!恋人の写真をIDEAの背景画像に設定する方法【おすすめ集
-
htmlとwordの相互変換の実装(画像あり)