JavaBeanのBuilderモード

11928 ワード

静的ファクトリとコンストラクタ
複数の異なるパラメータを含む構造関数の再ロード
大量のオプションパラメータにうまく拡張できません
JavaBean方式
無パラメトリックコンストラクション関数を呼び出してオブジェクトを作成し、setterメソッドで必要なパラメータを設定します.
オブジェクト構築プロセスはいくつかの呼び出しに分割され、構築中にJavaBeanが不一致になる可能性があります.クラスはコンストラクタパラメータの有効性を検証することで一貫性を保証できません.
Builderモード
目的のオブジェクトを直接生成せず、コンストラクタ(または静的ファクトリ)を呼び出してbuilderオブジェクトを得、クライアントはbuilderオブジェクト上でsetterメソッドのようなものを呼び出して、関連するオプションパラメータを設定し、最後にbuildメソッドを呼び出して可変オブジェクトを生成する
public class Person {
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                '}';
    }

    private String name;
    private String address;
    private String firstName;
    private String lastName;

    private Person(String name, String address, String firstName, String lastName) {
        this.address = address;
        this.name = name;
        this.lastName = lastName;
        this.firstName = firstName;
    }

    public static Builder builder() {
        return new Builder();
    }

    public static class Builder {

        private String name;
        private String address;
        private String firstName;
        private String lastName;

        public Builder name(final String name) {
            this.name = name;
            return this;
        }

        public Builder address(final String address) {
            this.address = address;
            return this;
        }

        public Builder lastName(final String lastName) {
            this.lastName = lastName;
            return this;
        }

        public Builder firstName(final String firstName) {
            this.firstName = firstName;
            return this;
        }

        public Person build() {
            return new Person(name, address, firstName, lastName);
        }
    }
}

クライアントコール
        Person p = new Person.Builder().address("  ").firstName(" ").lastName(" ").name("  ").build();
        System.out.println(p);
        Person person = Person.builder().address("  ").firstName(" ").lastName(" ").name("  ").build();
        System.out.println(person);

IDEを使用する場合は、クラスプロパティを宣言するだけで、Lombokプラグインの@Builder注釈を直接使用できます.
@Builder
@ToString
public class LombokPerson {
    private String name;
    private String address;
    private String firstName;
    private String lastName;
}

生成されたclassソースの表示
public class LombokPerson {
    private String name;
    private String address;
    private String firstName;
    private String lastName;

    @ConstructorProperties({"name", "address", "firstName", "lastName"})
    LombokPerson(String name, String address, String firstName, String lastName) {
        this.name = name;
        this.address = address;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public static LombokPerson.LombokPersonBuilder builder() {
        return new LombokPerson.LombokPersonBuilder();
    }

    public String toString() {
        return "LombokPerson(name=" + this.name + ", address=" + this.address + ", firstName=" + this.firstName + ", lastName=" + this.lastName + ")";
    }

    public static class LombokPersonBuilder {
        private String name;
        private String address;
        private String firstName;
        private String lastName;

        LombokPersonBuilder() {
        }

        public LombokPerson.LombokPersonBuilder name(String name) {
            this.name = name;
            return this;
        }

        public LombokPerson.LombokPersonBuilder address(String address) {
            this.address = address;
            return this;
        }

        public LombokPerson.LombokPersonBuilder firstName(String firstName) {
            this.firstName = firstName;
            return this;
        }

        public LombokPerson.LombokPersonBuilder lastName(String lastName) {
            this.lastName = lastName;
            return this;
        }

        public LombokPerson build() {
            return new LombokPerson(this.name, this.address, this.firstName, this.lastName);
        }

        public String toString() {
            return "LombokPerson.LombokPersonBuilder(name=" + this.name + ", address=" + this.address + ", firstName=" + this.firstName + ", lastName=" + this.lastName + ")";
        }
    }
}

クライアントコール:
        LombokPerson lombokPerson = LombokPerson.builder().address("  ").firstName(" ").lastName(" ").name("  ").build();
        System.out.println(lombokPerson);

https://dzone.com/articles/too-many-parameters-java-1