Java での静的ファクトリ メソッドの使用方法の詳細な説明

黄舟
リリース: 2017-09-09 13:11:35
オリジナル
1675 人が閲覧しました

この記事では主に Java 静的ファクトリ メソッドの詳細な説明に関する関連情報を紹介します。この記事を通じて、今日から Java ファクトリ メソッドをマスターできることを願っています。必要な方は

Java 静的ファクトリ メソッドの詳細な例を参照してください。

静的ファクトリメソッドとは

クラスの場合、ユーザーがそれ自体のインスタンスを取得するために、最も一般的な方法はパブリックコンストラクターを提供することです。
もちろん、ここで紹介したいのは別のメソッドです。それは、クラスのインスタンスを返す静的メソッドである静的ファクトリー メソッドです。
たとえば、基本型 boolean をカプセル化されたクラスに変換する Boolean のメソッド、valueOf:


public static Boolean valueOf(boolean b) { 
  return (b ? TRUE : FALSE); 
}
ログイン後にコピー

静的ファクトリ メソッドを使用する理由

それでは、なぜ静的ファクトリ メソッドを使用するのでしょうか。なぜコンストラクターを使用しないのでしょうか?

静的ファクトリ メソッドには、名前付き、環境に優しい、複数の子という 3 つの特性があるため、以下でそれぞれについて説明します。

> 名前付き静的ファクトリメソッドには名前があります

コンストラクターの場合、異なる入力パラメーターに応じて複数のコンストラクターが存在する可能性がありますが、ユーザーが呼び出すとき、これらのコンストラクターの名前はすべて同じであるため、混乱するでしょう。どちらに電話すべきか。


静的ファクトリーメソッドを使用した後は、その機能に応じてメソッドにさまざまな名前を付けることができます。名前が適切に選択されていれば、ユーザーはメソッド名を見たときにその名前が何を意味するのかがわかり、どのメソッドを使用すべきかがわかります。この時点で が呼び出され、コードの可読性が大幅に向上します。

> 環境に優しい

を呼び出すたびに新しいオブジェクトを作成する必要はありません。コンストラクターを使用すると、毎回新しいオブジェクトが生成されます。


静的ファクトリ メソッドは、事前に作成されたオブジェクトを繰り返し返すことができます。


上記のブール値は非常に良い例です。TRUE 変数と FALSE 変数は両方とも事前に作成されており、それを使用する必要がある人は、変更されることを気にせずにそれを返すことができます。


以下は、2 つの変数 TRUE と FALSE の初期化コードです:



public final class Boolean implements java.io.Serializable, 
                   Comparable<Boolean> 
{ 
  /** 
   * The {@code Boolean} object corresponding to the primitive 
   * value {@code true}. 
   */ 
  public static final Boolean TRUE = new Boolean(true); 
 
  /** 
   * The {@code Boolean} object corresponding to the primitive 
   * value {@code false}. 
   */ 
  public static final Boolean FALSE = new Boolean(false); 
 
  ...   
}
ログイン後にコピー

> 複数のサブタイプは、元の戻り値の型の任意のサブタイプのオブジェクトを返すことができます

コンストラクターを使用すると、次のことができます。型のオブジェクトのみを返します。静的ファクトリ メソッドでは、必要に応じて元の戻り値の型のサブタイプのオブジェクトを返すことができます。

EnumSet の noneof メソッドを例に挙げます。


/** 
 * Creates an empty enum set with the specified element type. 
 * 
 * @param elementType the class object of the element type for this enum 
 *   set 
 * @throws NullPointerException if <tt>elementType</tt> is null 
 */ 
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) { 
  Enum[] universe = getUniverse(elementType); 
  if (universe == null) 
    throw new ClassCastException(elementType + " not an enum"); 
 
  if (universe.length <= 64) 
    return new RegularEnumSet<>(elementType, universe); 
  else 
    return new JumboEnumSet<>(elementType, universe); 
}
ログイン後にコピー
パフォーマンス上の理由から、返される特定の型は列挙型の数によって決まります。64 を超える場合は JumboEnumSet を返し、それ以外の場合は RegularEnumSet を返します。これら 2 つのタイプはユーザーには表示されません。ユーザーは、これらが EnumSet であることだけを認識する必要があります。

それは、静的ファクトリ メソッドがコンストラクターよりも優れているためです。クラスを作成するとき、最初に行うべきはパブリック コンストラクターを提供することではなく、静的ファクトリ メソッドを優先する必要があります。

一般的な静的ファクトリ メソッド名

静的ファクトリ メソッドの従来の名前をいくつか示します。


valueOf/Of - 型変換、返されるインスタンスと入力パラメータは同じ値になります (Boolean など)。 ), EnumSet.valueOf()

getInstance - 事前に作成されたインスタンスを返します
newInstance - 新しいインスタンスを返します

静的ファクトリメソッドはファクトリパターンではないでしょうか?

ここまで言うと、これは純正モデルではないのではないかと思われる方も多いのではないでしょうか?回答: まったく同じではありません。

この記事で説明する静的ファクトリ メソッドは、ファクトリ パターンと同様にコンストラクターを置き換えるために使用されるメソッドであり、どちらも上記の 3 つの利点 (名前付け、環境保護、複数の子) を備えています。

ただし、この 2 つの実装方法と使用シナリオは異なります。


まず、コード構造の観点から直観的に言えば、私たちが話しているファクトリ パターンは通常、ファクトリ メソッドが定義されている xxxFactory クラスを必要としますが、この記事で説明する静的ファクトリ

メソッドは 1 つだけ必要です。クラス、クラス自体 これは、オブジェクトを生成するためのファクトリ メソッドを提供します。


次に、設計中にクラスが静的ファクトリ メソッドを提供する場合でも、ファクトリ パターンを使用する必要があるかどうかを考えてみましょう。


はい、その必要はありません。


言い換えると、クラスが静的ファクトリ メソッドを提供しない場合にのみ、ファクトリ パターンを使用する必要があります。


考えてみてください。Apple に強力な部品工場があるとしても、Foxconn は必要でしょうか?

概要

静的ファクトリーメソッドには、名前付き、環境に優しい、複数の子という 3 つの大きな利点があります。


クラスが静的ファクトリ メソッドを提供する場合、このクラスのファクトリ パターンを考慮する必要はありません。


クラスを作成するとき、最初に行うべきことは、パブリック コンストラクターを提供することではなく、静的ファクトリー メソッドを優先することです。

以上がJava での静的ファクトリ メソッドの使用方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート