アイテム2:作成者にパラメータがたくさんある場合は、コンストラクタを考慮してください.


  • 静的パラメータとジェネレータの共通の制限:多くのオプションパラメータがある場合、対応しにくい.
  • パラメータが多い場合の対応方法

  • 点積層構造関数パターン
  • public class NutritionFacts {
        private final sevingSize;
        private final servings;
        private final int calories;
        private final int fat;
        private final int sodium;
        
        public NutritionFacts(int servingSize, int servings) {
        this(servingSize, servings, 0);
        }
        
        public NutritionFacts(int servingSize, int servings, int calories) {
        this(servingSize, servings, calories, 0);
        }
    
        public NutritionFacts(int servingSize, int servings, int calories, int fat) {
        this.servingSize = servingSize;
        this.servings = servings;
        this.calories = calories;
        this.fat = fat;
        }
    }
    設定しないパラメータの値
  • を指定する必要があります.
  • コードは低毒性で、修正と使用が困難です.
  • Java Beansモード
  • オブジェクトを
  • のデフォルトジェネレータとして作成し、値をSetterに設定します.
  • の欠点
  • オブジェクトを生成するには、Setterを複数回呼び出す必要があります.
  • オブジェクトを完全に作成する前に、コンシステンシはクラッシュしました.
  • のため、クラスを変更することはできません.
  • スレッドのセキュリティを得るためには、追加の作業も必要です.
  • 凍結方法
    テクニック
  • 作成したオブジェクトをフリーズし、フリーズ前に使用できないようにして、上記の欠点を緩和します.
  • ですが、コンパイルフェーズでは、オブジェクトを使用する前にfreezeメソッドが呼び出されたかどうかを検証できないため、ランタイムエラーが発生しやすいです.
  • ビルドモード
  • ドット積層ジェネレータモードのセキュリティとJavaBeansモードの可読性
  • ビルダアレイ


  • きどうモード
    ビルダーオブジェクトを取得するには、
  • 必須パラメータのみでジェネレータ/静的ファクトリを呼び出します.
  • 選択パラメータを
  • ビルダーオブジェクトに設定する設定方法(Setterと同様).
  • パラメータを持たない構築方法を呼び出して、所望の(通常は変わらない)オブジェクトを得る.

  • コンストラクタは、通常、生成するクラスで静的メンバークラスとして作成されます.

  • 疑問:非栄養欠陥類は変わらない??

  • BuilderでのSetterメソッド
  • 自身を返却し、メソッドチェーンを行うことができます
  • メソッドチェーン=Fluent API
  • メソッド名を属性名とし、可読性の良いコードを記述することができる:
  • NutritionFacts cocacola = NutritionFacts.Builder(240, 8).calories(100).sodium(35).carbohydrate(27).build();
  • ビルドモードは、Python/Scaraを模した命名オプションパラメータ(optionalparametersと命名)である.

  • 検証コード

  • コンストラクタの作成者とメソッドで入力パラメータを確認する

  • buildメソッド呼び出しのコンストラクション関数=複数のパラメータ間の不変量をチェック
  • ビルダーからパラメータをコピーし、対応するオブジェクトフィールドを確認します.
  • 問題発見
  • の場合、IllegalArgumentException
  • 不変と不変

  • 不変
  • の変更は許可されていません.<->可変オブジェクト
  • Ex) String
  • 不変量
  • プログラムが実行中又は所定時間内に満たすべき条件
  • .
  • の変更は許可されていますが、条件の下でのみ変更できます.
  • Ex)Listのサイズは0より大きく、Periodのstartフィールド値はendフィールド値
  • より高くなければならない
  • 可変オブジェクトには不変式が存在してもよく,不変は不変式の極端な例といえる.
  • コンストラクタと階層クラス

  • 各レイヤのクラスで関連コンストラクタをメンバーとして定義
  • 抽象クラスは抽象コンストラクタを提供し、具体的なクラス(具体的なクラス)は具体的なコンストラクタを提供する.
  • EnumSetを追加!!!
  • アナログセルフタイプ慣用句:セルフタイプのないJavaでセルフメソッドを定義する
  • は、フォーマットされていないコピーのメソッドチェーン
  • をサポートする.
  • 共通変換タイプ(コヒーレント戻りタイプ):親メソッドで定義された戻りタイプの機能ではなく、サブクラスのメソッドがサブタイプを返す機能
  • は、変換を必要としないビルダー
  • を提供する.

    それ以外は


  • コンストラクタを使用すると、複数の可変パラメータ(varargs)パラメータを使用できます.
  • または
  • メソッドを複数回呼び出すことができ、呼び出すたびに残るパラメータのセットを1つのフィールド
  • とする.

  • コンストラクタの柔軟性

  • 短所

  • オブジェクトを作成する前にコンストラクタを作成する必要があります
  • のパフォーマンスへの悪影響

  • パラメータが多いときに発光
  • ですが、パラメータが徐々に増えているので、最初からビルドで作った方が良い場合が多いです.