多个构造参数考虑使用Builder构造器模式

对于有多个参数的类,我们一向习惯采用重载构造方法的模式,像这样

public class User {
    private String name;
    private int age;
    private String address;

    public User(String name) {
        super();
        this.name = name;
    }

    public User(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public User(String name, int age, String address) {
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }
}

当需要多个构造参数时,我们必须按照顺序依次传入,如果参数更多,那么代码会很难写,并且难以阅读,如果读者想知道哪些参数是什么意思就必须很仔细地数着来探究参数的意义,如果顺序弄反了程序就会出错.

那么在多个构造参数时我们有第二种方法,即JavaBean模式,这种模式我们采用无参构造方法创建对象,并且提供get,set方法

/** User类 */
public class User {
    private String name;
    private int age;
    private String address;

    public User(String name) {
        super();
        this.name = name;
    }

    public User(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public User(String name, int age, String address) {
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public User() {
        super();
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public static void main(String[] args) {

    }
}

这样弥补了重载多个构造方法的不足,创建实例变得更容易,并且代码也更易读.这种写法也有很严重的缺点,因为构造过程被分配到了几个调用中,在构造过程中JavaBean可能处于不一致的状态.

第三种替代方法就是Builder模式,不直接生成想要的对象,而是在客户端利用所有必要的参数调用构造器,得到一个builder对象.然后客户端在builder对象上调用类似于setter的方法,来设置每个相关的可选参数.最后,客户端调用无参的build方法来生成不可变的对象.

/** User类 */
public class User {
    private String name;
    private int age;
    private String address;

    public static class Builder {
        // 必要参数
        private String name;
        // 可选参数
        private int age;
        private String address;

        public Builder(String name) {
            this.name = name;
        }
        //调用setter方法后必须返回对象本身,已完成后续调用
        public Builder setAge(int age) {
            this.age = age;
            return this;
        }

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

        // 调用无参方法生成示例
        public User build() {
            return new User(this);
        }
    }

    public User(Builder builder) {
        name = builder.name;
        age = builder.age;
        address = builder.address;
    }

    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + ", address=" + address + "]";
    }

    public static void main(String[] args) {
        User user = new User.Builder("dong").setAge(25).setAddress("shenzhen").build();
        System.out.println(user.toString());
    }
}

以上就完成了Builder的代码,代码十分易读.Builder模式十分灵活,可以利用单个builder构建多个对象,builder的参数可以在创建对象期间进行调整,也可以随着不同的对象而改变.Android 上的AlertDialog便是采取这种写法来构建提示对话框的.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值