第2条複数のコンストラクタパラメータに遭遇した場合、コンストラクタの使用を考慮する

2702 ワード

複数のコンストラクタパラメータに遭遇した場合は、コンストラクタを使用することを考慮します.
静的ファクトリとコンストラクタには共通の限界があります.それらは多くのオプションパラメータにうまく拡張できません.
大量のオプションパラメータに遭遇した場合、一般的な処理方法はリロード構造方法である.
リロードコンストラクタモードは可能ですが、多くのパラメータがある場合、クライアントコードは書きにくく、読みにくいです.
長い列のタイプが同じパラメータは微妙なエラーを引き起こします.クライアントが誤って2つのパラメータの順序を逆転した場合、コンパイラもエラーはありませんが、プログラムが実行されている間にエラーが発生します.
  • は、オブジェクトを作成するために誤食コンストラクタを呼び出すJavaBeanモードの代わりに、setterメソッドを呼び出し、必要な各パラメータを設定し、関連するオプションパラメータ
  • を呼び出す.
     Person mPerson = new Person();
        mPerson.setName("bob");
        mPerson.setAge(10);
        mPerson.setProfession("doctor")
        ...
    

    残念なことにjavaBeanモード自体には深刻な欠点があります.構造プロセスが複数のsetに分割されると、スレッドが安全ではなく、オブジェクトが一致しない状態になりやすいためです.
  • 代替方式2は、オーバーラップモードのような安全を保証するとともにjavaBeansモードのような可読性を保証することができ、これがbuilderモードの一種である
  • である.
    public class NutritionFacts {
        private int servingSize ;
        private int servings ;
        private int calories;
        private int fat ;
        private int sodium ;
        private int carbohydrate;
    
        public static class Builder {
            private int servingSize;
            private int servings;
            private int calories;
            private int fat;
            private int sodium;
            private int carbohydrate;
    
            public Builder(int servingSize, int servings) {
                this.servings = servings;
                this.servingSize = servingSize;
            }
    
            public Builder calories(int val) {
                calories = val;
                return this;
            }
            public Builder carbohydreate(int val){
                carbohydrate = val;
                return this;
            }
            public Builder sodium(int val){
                sodium = val;
                return this;
            }
            public Builder fat(int val){
                fat = val;
                return this;
            }
            public NutritionFacts build(){
                return new NutritionFacts(this);
            }
    
        }
        private NutritionFacts(Builder builder){
            servingSize = builder.servingSize;
            servings = builder.servings;
            calories = builder.calories;
            fat = builder.fat;
            sodium =builder.sodium;
            carbohydrate = builder.carbohydrate;
        }
    }
    

    すべてのデフォルトパラメータ値を1つの場所に配置し、builderのsetterメソッドはそれ自体を返します.これにより、呼び出しを接続できます.クライアントコードは次のようになります.
      NutritionFacts cocaCola = new NutritionFacts.Builder(240,8).
                    calories(100).sodium(35).build();
    

    このようなクライアントコードは記述に同意し、重要なのは、読みやすく、builderモードで特定の名前をシミュレートしたオプションパラメータbuilderはコンストラクタのようにパラメータに制約条件を強要することができ、builderメソッドはこれらの制約条件を検証することができ、builderからオブジェクトにパラメータをコピーした後、builderドメインではなくオブジェクトドメインで検証することができます.いかなる制約条件にも違反した場合、builderメソッドはILLegalStateExceptionを投げ出すべきであり、異常の詳細はその制約条件に違反していることを示すべきである.