effective java 第2条:遇到多个构造器参数时要考虑用构造器

199 阅读1分钟

如果构建一个对象需要很多参数时,那么有三种方式可以实现。 第一种就是多重构造器

public class Person {

    private final int id;           //required
    private final String name;      //required
    private final int age;          //optional
    private final int gender;          //optional
    private final Date brithDay;          //optional
    
    public Person(int id, String name, int age, int gender, Date brithDay) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.brithDay = brithDay;
    }
    public Person(int id, String name, int age, int gender){
        this(id, name, age, gender, null);
    }
    public Person(int id, String name, int age){
        this(id, name, age, 0);
    }
    public Person(int id, String name){
        this(id, name,0);
    }
}

第二种JavaBean 通过setter设置参数 缺点:因为构造过程被分到了几个调用中,在构造过程中JavaBean可能处于不一致的状态。 第三种Builder构建器模式

public class Person {

    private final int id;           //required
    private final String name;      //required
    private final int age;          //optional
    private final int gender;          //optional
    private final Date birthday;          //optional

    public static class Builder implements com.zml.Builder<Person>{

        private int id;           //required
        private String name;      //required
        private int age = 0;          //optional
        private int gender = 0;          //optional
        private Date birthday = null;          //optional

        public Builder(int id,String name){
            this.id = id;
            this.name = name;
        }
        public Builder age(int age){
            this.age = age;
            return this;
        }
        public Builder gender(int gender){
            this.gender = gender;
            return this;
        }
        public Builder brithDay(Date brithDay){
            this.birthday = brithDay;
            return this;
        }

        @Override
        public Person builder() {
            return new Person(this);
        }
    }

    public Person(Builder builder) {
        this.id = builder.id;
        this.name = builder.name;
        this.age = builder.age;
        this.gender = builder.gender;
        this.birthday = builder.birthday;
    }

    public static void main(String[] args) {
        Person person = new Person.Builder(1,"hello").builder();
    }
}
public interface Builder<T> {
    T builder();
}