[Java]スタティックファクトリメソッド
2850 ワード
💡 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つのサブクラス(RegularEnumSet
、JumboEnumSet
)の1つの例を返す.クライアントはこの2つのクラスの存在を知らない.クライアントは、ファクトリで渡されるオブジェクトが
EnumSet
のサブクラスであればよい.どのレベルのインスタンスなのか分からないし、知る必要もありません!5.スタティックファクトリメソッドを作成するときに、返すオブジェクトクラスが存在する必要はありません。
これは、
JDBC
などのサービスプロバイダフレームワークを作成するための基礎です.しかし,静的工場法は利点だけではない.欠点もある.
1.パブリックまたは保護が必要な作成者を継承し、静的ファクトリメソッドのみではサブクラスを作成できません。
これは継承型ではなく複合型の使用を誘導し,それを不変の型にするには,この制限を守らなければならない点が逆に利点とされている.
2.開発者は静的工場の方法を見つけるのが難しい。
コンストラクション関数のようにAPIの説明に明確に表示されないため、ユーザは静的ファクトリメソッドクラスをインスタンス化する方法を見つけなければならない.
したがって、APIドキュメントとメソッド名を熟知している約定に基づいて問題を解決する必要があります.
このように、
정적 팩토리 메소드
とpublic 생성자
にはそれぞれの用法があるので、相対的なメリットとデメリットを理解して使用することが望ましい.しかし、
정적 팩토리
を使うのが有利なので、盲目的にpublic 생성자
を提供する習慣を改めなければならない.Reference
この問題について([Java]スタティックファクトリメソッド), 我々は、より多くの情報をここで見つけました https://velog.io/@jodawooooon/Java-정적-팩토리-메소드Static-Factory-Methodテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol