[Java]スタティックファクトリメソッド


💡 Effective Java学習

クラスは、静的ファクトリメソッド(static factory method)を単独で提供することができる.
この静的工場法は設計モードの工場法とは異なる.
public static Boolean valueOf(boolean b){
	return b ? Boolean.TRUE : Boolean.FALSE;
}
以上の方法は、基本タイプbooleanを受け入れ、Booleanオブジェクト参照に変換する.
静的工場法の利点は、

1.名前が付けられる


作成者にのみ渡されるパラメータでは、返されるオブジェクトのプロパティを正しく記述できません.逆に、静的ファクトリメソッドは、名前で返されるオブジェクトの特性を記述することができる.
クラスに同じコンストラクション関数が複数必要な場合は、コンストラクション関数を静的ファクトリメソッドに変換し、各メソッドに差異を表示する名前を付けることが望ましい.

2.呼び出しのたびにインスタンスを再作成する必要はありません。


不変クラスは、インスタンスを事前に作成したり、新しく作成したインスタンスをキャッシュしたりすることで、不要なオブジェクトの作成を回避できます.常に同じオブジェクトを要求する場合にパフォーマンスを向上させることができます.
静的ファクトリ化されたクラスは、どのインスタンスをいつ生存させるかを制御します.この等級は인스턴스 통제 클래스と呼ばれています.
インスタンスを制御する理由は何ですか?
制御例の場合、クラスを싱글톤に設定してもよいし、クラスを인스턴스화 불가に設定してもよい.また、不変値クラスに同期インスタンスが1つしかないことを確認することもできます.(a==b일 때만 a.equals(b)成立)

3.戻りタイプのサブタイプオブジェクトを持つ機能。

유연성が返すオブジェクトのクラスを自由に選択できることを保証します.
APIを作成するときに、アプリケーションを適用すると、実装クラスを公開せずにオブジェクトを返すことができ、APIを小さく保つことができます.
これも,インタフェースを静的ファクトリメソッドとして返すタイプのインタフェースベースのフレームワークを作成する核心である.

4.入力パラメータに従って、毎回異なるオブジェクトを返すことができます。


戻りタイプのサブタイプであれば、任意のクラスのオブジェクトを返すことができます.EnumSetクラスには共通ジェネレータがなく、静的ファクトリのみが提供され、OpenJDKは要素の数に応じて2つのサブクラス(RegularEnumSetJumboEnumSet)の1つの例を返す.
クライアントはこの2つのクラスの存在を知らない.クライアントは、ファクトリで渡されるオブジェクトがEnumSetのサブクラスであればよい.どのレベルのインスタンスなのか分からないし、知る必要もありません!

5.スタティックファクトリメソッドを作成するときに、返すオブジェクトクラスが存在する必要はありません。


これは、JDBCなどのサービスプロバイダフレームワークを作成するための基礎です.
しかし,静的工場法は利点だけではない.欠点もある.

1.パブリックまたは保護が必要な作成者を継承し、静的ファクトリメソッドのみではサブクラスを作成できません。


これは継承型ではなく複合型の使用を誘導し,それを不変の型にするには,この制限を守らなければならない点が逆に利点とされている.

2.開発者は静的工場の方法を見つけるのが難しい。


コンストラクション関数のようにAPIの説明に明確に表示されないため、ユーザは静的ファクトリメソッドクラスをインスタンス化する方法を見つけなければならない.
したがって、APIドキュメントとメソッド名を熟知している約定に基づいて問題を解決する必要があります.
このように、정적 팩토리 메소드public 생성자にはそれぞれの用法があるので、相対的なメリットとデメリットを理解して使用することが望ましい.
しかし、정적 팩토리を使うのが有利なので、盲目的にpublic 생성자を提供する習慣を改めなければならない.