ジェネレータモード


ジェネレータモード
コンストラクタモードは、オブジェクトを作成するときによく使用されるモードです.
次のコードスタイルを使用してオブジェクトを作成する場合は、コンストラクタ配列が使用されていると言えます.
 Member.Builder builder = new Member.Builder("sa1341", "junyoung");
        builder.age(30)
               .hobby("soccer");
               
Member member = builder.build();
Effective JavaでBuilderモードが使用されるタイミング:
ルール#ルール#作成者パラメータが多い場合は、[ジェネレータ配列を適用](Apply Generator Array)を選択します.
この効果javaで説明したコンストラクタアレイは、オブジェクトを作成するための簡潔で柔軟なテクノロジーです.
オブジェクトを作成する方法を3つ紹介しました.
  • 点積層構造関数パターン
  • ジャワ文パターン
  • ビルドモード
  • 1.階層単位モード
    まず、ポイント積層ジェネレータアレイを作成する方法は、次のとおりです.
    1.必要なパラメータを受信する必須コンストラクション関数を作成します.
    2.オプションパラメータの作成者を1つ追加します.
    3.2つのオプションパラメータを含む作成者を追加します.
    4.繰り返し実行
    5.オプションのすべてのパラメータの作成者を追加します.
    次のコードは、ポイント積層構造関数モードコードの例の1つであり、コストインに関連するコードである.
    public class Member{
        
        private final String id;
        private final String name;
        private final String hobby;
    
        //필수 생성자
        public Member(String id){
            this(id, "이름 비공개", "취미 비공개");
        }
    
        // 1개의 선택적 인자를 받는 생성자
        public Member(String id, String name){
            this(id, name, "취미 비공개");
        }
    
        //모든 선택적 인자를 다 받는 생성자
        public Member(String id, String name, String hobby){
            this.id = id;
            this.name = name;
            this.hobby = hobby;
        }
    }
    長所
    新しいメンバー(「sa 1341」、「非公開名」および「非公開興味」)を頻繁に呼び出す場合は、新しいメンバー(「sa 1341」)を使用して置き換えることができます.
    短所

  • 他のコンストラクション関数を呼び出すコンストラクション関数が多いため、パラメータを追加するときにコードを変更するのは難しい.また,コードの毒性も低い.

  • 特に,パラメータ数が多い場合,呼び出しコードのみを表示するのは意味が理解しにくい.
  • //호출 코드만으로는 각 인자의 의미를 알기 어렵습니다.
    Car car = new Car(1,30.2,5,7,8,6,4);
    Car car = new Car(3,35,210,24);
    Car car = new Car(230,71);
    2.javabeanモード
    階層型モードの代替としてJavaBeanモードについて説明します.
    このモードではsetterメソッドを使用して生成コードを読み取り可能にします.
    Car car = new Car();
    car.setName("Hyundai");
    car.setNumber(240);
    長所
  • では、各パラメータの意味が容易に理解できるようになりました.
  • は、複数のジェネレータを複雑に作成する必要はありません.
  • 短所

  • オブジェクトが一致しません.
    1回の呼び出しでは、オブジェクトの作成は終了しません.
    つまり、一度に作成するのではなく、作成したオブジェクトに値を設定しています.

  • setterメソッドが存在するため、可変クラスを作成できません.
    スレッドのセキュリティを確保するには、レイヤごとのジェネレータアレイよりも多くの作業を実行する必要があります.
  • 3.ビルダーモード(Effective Javaスタイル)
    public class Member {
    
        private final String id;
        private final String name;
        private final int age;
        private final String hobbyy;
        
        public static class Builder {
    
            private final String id;
            private final String name;
            private int age;
            private String hobby;
    
    
            public Builder(String id, String name) {
                this.id = id;
                this.name = name;
            }
    
            public Builder age(int age){
                this.age = age;
                return this;
            }
    
            public Builder hobby(String hobby){
                this.hobby = hobby;
                return this;
            }
    
            public Member build() {
                return new Member(this);
            }
    
        }
    
        public Member(Builder builder) {
            this.id = builder.id;
            this.name = builder.name;
            this.age = builder.age;
            this.hobbyy = builder.hobby;
        }
    
        public String getId() {
            return id;
        }
    
        public String getName() {
            return name;
        }
    
        public int getAge() {
            return age;
        }
    
        public String getHobbyy() {
            return hobbyy;
        }
    }
    前述のように、オブジェクトは次のように作成できます.
    Member.Builder builder = new Member.Builder("sa1341", "junyoung");
    builder.age(28)
           .hobby("soccer");
    Member member = builder.build();
    以下のように使用することもできます.
    //각 줄마다 builder를 타이핑 하지 않아도 되어 편리합니다.
    Member member = new Member.Builder("sa1341","junyoung") // 필수값 입력
        .age(28)
        .hobby("농구")
        .build(); // build() 메소드가 객체를 생성해 돌려줍니다.
    長所
    各パラメータの意味は分かりやすい.
  • setterメソッドがないため、変更できないオブジェクトを作成できます.
  • 一度に作成されたオブジェクト
  • は、オブジェクトの一貫性を破壊しません.
  • build()関数に入力した値が無効かどうかを検証させることもできます.