参考:「効果的なJavaのよう」https://www.jianshu.com/p/ceb5ec8f1174。
レビューに基づいて、
1.コンストラクタは何ですか?
新しいオブジェクトクラスのコンストラクタが所望の状態に初期化インスタンスに対して実行されるクラスと同じ名前で構成。
各クラスには引数なしのデフォルトコンストラクタを持つことになります。手動でコンストラクタを自分で書くことができます。
例えば、人々のクラスのコンストラクタを記述します
公共の人々 (文字列名、int型の年齢) { この .NAME = 名前; この .Age = 年齢; }
そして、上のこのクラスの新しいインスタンスを作成します
人々 = 新 Prople( "张三"、18);
上記のような、新たな後の対応するパラメータに加えてもよいです。我々はパラメータを追加しない場合は、デフォルトの引数なしのコンストラクタを呼び出します。
2.ファクトリメソッド
ここでは、静的ファクトリメソッドは、ファクトリメソッドデザインパターンの間で直接の対応ではありません。
一般的に、この種または類似LoaclDateそれらに使用される静的なファクトリメソッドのNumberFormat。例えばLocalDate.nowのように。
なぜstaticファクトリメソッドを使うのか?例えばNumberFormat.getCurrencyInstance()とNumberFormat.getPercentInstance()メソッドの両方植物は、パーセンテージの種類を貨幣の種類を得ます。
しかし、彼らの受信パラメータは同じであり、これを行うには、コンストラクタを使用する必要がある場合は、コンストラクタは、同じ名前とクラスを持っている必要があり、明示的に区別するために名前を付けていない一方で、追加のパラメータを追加する必要があり、開発者を使用することの難しさを増します。
次の詳細は、静的ファクトリメソッドの他の利点を教えてくれます。
staticファクトリメソッドの利点
自分の静的なファクトリメソッドを記述するために、
パブリック クラスEJ01_01 { プライベート int型のNum = 0 ; // 静的ファクトリメソッド のパブリック 静的 EJ01_01コンバート(ダブル{NUM) EJ01_01 ej01_01 = 新しい新しいEJ01_01(); ej01_01.Num =(INT )民は、 戻りej01_01; } // テストが戻ってもよいですサブクラス パブリック 静的EJ01_01_Sonの変換(){ 返す 新しい新しいEJ01_01_Sonを(); } 公共 のint ショー(){ 返す この.numを。 } 公共 INT Add_10(){ 戻り 、この .Num + 10 。 } } クラスのテスト{ 公共 静的 ボイドメイン(文字列引数[]){ EJ01_01テスト = EJ01_01.convert(1.2 )。 System.out.println(test.Add_10())。// 输出11 のSystem.out.println(test.Show())。// 输出1 } } // 子类 クラス EJ01_01_Sonは延びEJ01_01を{ }
1. staticファクトリメソッドは名前を持っています。
これはNumberFormat.getCurrencyInstance()とNumberFormat.getPercentInstance()と同じ上記のように、言うまでもないです。開発者は、一目でその違いを見ることができます。
2.新しいオブジェクトに各呼び出しを作成する必要はありません。
上記のコードです。テストクラスで:
EJ01_01テスト= EJ01_01.convert(1.2)。
これは、直接呼び出されるすべての新しいオブジェクトを作成しません。
3.これは、元の復帰に任意のサブクラスの型を返すことができます
コンストラクタは、元の形に戻すことができますが、静的なファクトリメソッドにサブクラスを返すことができます。以下のような:
// テストサブクラスを返すことができる 公共の 静的{)(EJ01_01_Sonコンバート 戻り 新しい新しい(EJ01_01_Sonを); }
私はまた、このようなメソッドの戻り値の型など、他の一般的なデータ型、直接書き込まint型に変換することができますが、そのようなアプローチノルムかどうかわからない任意の参考資料を見ていないを返すことができますテストされています。
4.あなたは、プロパティの外部被ばくを減らすことができます
以下の機能コード、呼び出さGET_TYPEのみ所定の入力パラメータは、対応する出力データ。
この状況は、入力MAX、MIN、このパラメータ、他のパラメータを直接入力エラーのみを許可するなど、いくつかの方法として、非常に一般的です。
しかし、我々は唯一達成するためにコンストラクタあれば、それは制限がユーザーによって入力されているものではありません。次のコードは、コンストラクタへの引数は、ユーザが対応する静的ファクトリメソッドを呼び出し、その後、ファクトリメソッドを割り当てることができるように、静的ファクトリメソッドと等価です。
クラスGET_TYPE { パブリック 静的 最終 int型 TYPE_Small = 1 。 パブリック 静的 最終 int型 TYPE_Moderate = 2 ; パブリック 静的 最終 int型 TYPE_Big = 3 ; プライベート GET_TYPE(int型タイプ){ スイッチ(タイプ){ ケース 1 : のSystem.out.println( "这是小号" )。 破ります; ケース 2 : するSystem.out.println( "这是号中"); 破ります; ケース 3 : のSystem.out.println( "这是大号" )。 破ります; } } パブリック 静的GET_TYPE小(){ 戻り 新しいGET_TYPE(TYPE_Small)を、 } パブリック 静的GET_TYPE中程度(){ 戻り 新しいGET_TYPE(TYPE_Moderate)を、 } パブリック 静的GET_TYPEビッグ(){ 戻り 新しい(TYPE_Big)をGET_TYPEします。 } } // 调用 クラスTest2を{ 公共 静的 ボイドメイン(文字列引数[]){ GET_TYPE get_small = Get_Type.Big(); // 大きい出力 } }
これらの点よりも静的ファクトリメソッド、私は見られないいくつかの他の利点を有していてもよく、いくつかは、ビューの現在の機能の残りの部分を知っている、完全に理解することはできません。