Item 2:パラメータが多い場合は、コンストラクタモードを考慮してください.


Itemサマリー


静的ファクトリとジェネレータは、オブジェクトを作成する方法です.
しかし、同じタイプのパラメータがたくさんあるとしたら?→開発者は、このクラスのドキュメントを参照して、各パラメータの意味を理解する必要があります.また、位置によってミスを犯す可能性も高くなります.
これらの問題を解決するために、今回のプロジェクトではコンストラクタモードを使用します.

レイヤジェネレータアレイ


必要なパラメータを受信するジェネレータを作成し続けます.
😅書きづらいので変数の数を減らしました!ハハハ
public class Item {
    private final String name;
    private final String company;
    private final int price;

    public NutritionFacts(String name, int price) {
        this(name, "", price);
    }

    public NutritionFacts(String name, String company, int price) {
        this(name, company, price);
    }

    public NutritionFacts(String name, String company, int price) {
        this.name = name;
        this.company = company;
        this.price = price;
    }
}
クラスのインスタンスを作成するには、必要なパラメータを含むコンストラクション関数の最短の1つを呼び出すだけです.
1章に示すように,作成者には名前がない.パラメータが増えるにつれて、開発者はどの変数をどこに置くべきかを混同する可能性があります.これにより、コードの作成や読み取りが難しくなります.また,開発者がパラメータ順序を変更してもコンパイラは気づかず,最終的には実行時エラーを引き起こす.
通常、これらのジェネレータは、ユーザが設定したくないパラメータを簡単に含んでいますが、これらのパラメータに値を指定する必要があります.  また,表面的にはそれほど悪くないように見えるが,パラメータ数が増加するとジェネレータコードは制御できない.  また,パラメータ入力を受信する際には,1つの数のパラメータを数えることに注意し,同じデータ型のパラメータを入力に変換してもコンパイラは気づかず,わけのわからない動作をする.
🤫以下の例から、書籍の例を参考にしました!@

Java beanモード


パラメータを持たない作成者を使用してオブジェクトを作成した後、setterを使用してパラメータ値を設定します.
public class NutritionFacts {
    private int servingSize = -1;
    private int servings = -1;
    private int calories = 0;
    private int fat = 0;
    private int sodium = 0;
    private int carbohydrate = 0;

    public NutritionFacts() {}

    public void setServingSize(int servingSize) {
        this.servingSize = servingSize;
    }

    public void setServings(int servings) {
        this.servings = servings;
    }

    public void setCalories(int calories) {
        this.calories = calories;
    }

    public void setFat(int fat) {
        this.fat = fat;
    }

    public void setSodium(int sodium) {
        this.sodium = sodium;
    }

    public void setCarbohydrate(int carbohydrate) {
        this.carbohydrate = carbohydrate;
    }
}
このモードでは、オブジェクトを作成するには、複数のメソッドを呼び出し、オブジェクトを完全に作成する前にコンシステンシがクラッシュします.  一致しないオブジェクトを作成した場合、デバッグも容易ではありません.インプラントエラーのコードと実行中に問題が発生したコードは物理的に遠いためです.  これらの問題のためです. JavaBeansモードでは、クラスを変更することはできません.スレッドのセキュリティを得るために、プログラマは追加の作業を行う必要があります.
#@ビルダーモード
コンストラクタアレイを使用してインスタンスを作成するプロセス!
クライアントは、ビルダーオブジェクトを直接作成するのではなく、ビルダーオブジェクトを呼び出して取得します.->コンストラクタオブジェクトが提供する設定方法を使用して、必要な選択パラメータを設定します->buildメソッドを呼び出して必要なオブジェクトを取得します.
public class NutritionFacts {
    private final int servingSize;
    private final int servings;
    private final int calories;
    private final int fat;
    private final int sodium;
    private final int carbohydrate;

    static class Builder {
//필수 매개변수private final int servingSize;
        private final int servings;

//선택 매개변수 - 기본값으로 초기화private int calories = 0;
        private int fat = 0;
        private int sodium = 0;
        private int carbohydrate = 0;

        public Builder(int servingSize, int servings) {
            this.servingSize = servingSize;
            this.servings = servings;
        }

        public Builder calories(int calories) {
            this.calories = calories;
            return this;
        }

        public Builder fat(int fat) {
            this.fat = fat;
            return this;
        }

        public Builder sodium(int sodium) {
            this.sodium = sodium;
            return this;
        }

        public Builder carbohydrate(int val) {
            {carbohydrate = 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;
    }
}

コンストラクタモードの特徴と利点

  • ビルドのsetterメソッドは、自身を返すため、連続的に呼び出すことができる. 
  • // 빌더 패턴 호출 예시
    NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
                                    .calories(100)
                                    .sodium(35)
                                    .carbohydrate(27)
                                    .build();
    この方法を「フルオロAPI」または「方法鎖」と呼ぶ.
    また、コンストラクタオブジェクトが提供する設定方法により、コードが読みやすくなり、使用しやすくなります.
  • ビルドモードは、階層設計のクラスとともに使用するのに適しています.
  • 各階層のクラスに関連するコンストラクタをメンバーとして定義し、抽象クラスに抽象コンストラクタ、特定のクラスに特定のコンストラクタを持たせます.
    コンストラクタを階層コンストラクタとして設計しても、開発者はコンストラクタモードと同じモードを使用できます.

  • 複数の可変パラメータ(varargs)パラメータを使用できます.

  • ビルドモードはかなり柔軟です.
    1つのコンストラクタに複数のオブジェクトを作成したり、コンストラクタに渡されたパラメータに基づいて別のオブジェクトを作成したりできます.オブジェクトかごに付与されたシーケンス番号のようなフィールドの一部は、コンストラクタによって自己充填されてもよい.
  • コンストラクタモードの欠点

  • バージョンを生成するコストは高くありませんが、パフォーマンスに敏感な場合は問題になる可能性があります.
  • パラメータは4つ以上に達しなければ価値がありません.
  • コンストラクタモードは、ジェネレータまたは静的パラメータ法よりも多くの利点があります.あるいはパラメータが増加する可能性があります!、複数のフィールドが同じタイプであれば、コンストラクタモードを考慮しましょう.