1. ホーム
  2. java

[解決済み] コンストラクタとgetInstance()メソッド(静的ファクトリメソッド)はいつ使うのか?

2023-05-07 13:25:26

質問

  1. いつ、どのようにコンストラクタを使用すればよいのでしょうか?

    Foo bar = new Foo();
    
    
  2. また、いつ、どのように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 コンストラクタを持たないクラスはサブクラス化できないことです。
  • 静的ファクトリーメソッドの第二の欠点は、他の静的メソッドと容易に区別できないことです。 他の静的メソッドと容易に区別がつかないことです。