1.什么时候使用构建器(Builder)

通常我们只需要使用 new User() 就可以创建一个对象,那么为什么还需要使用构建器呢。

假设我们有这么一个类

public class User {
    private int id;
    private String name;
    private String phone;
    private String sex;
    private String IDCard;
}

如果创建一个User对象只有idname是必须的,其他参数可以选填,也可以用下面两种方法创建该对象

1.构造函数

public class User {
    private int id;
    private String name;
    private String phone;
    private String sex;
    private String IDCard;

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

User user = new User(1,"izumi"); 就能创建一个对象。那这时如果想用三个、五个参数,就只能依次增加多个构造函数

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

    public User(int id, String name, String phone) {
        this.id = id;
        this.name = name;
        this.phone = phone;
    }

    public User(int id, String name, String phone, String sex, String IDCard) {
        this.id = id;
        this.name = name;
        this.phone = phone;
        this.sex = sex;
        this.IDCard = IDCard;
    }

这显然就有些不那么优雅

2.set方法

我们可以使用JavaBeans的set方法来实现多个参数赋值(这里为方便直接用了lombok)

import lombok.Data;

@Data
public class User {
    private int id;
    private String name;
    private String phone;
    private String sex;
    private String IDCard;
    
    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }
}
User user = new User(1,"izumi");
user.setSex("男");
user.setPhone("xxxxx");

这种做法简单易懂,但存在一些缺陷

因为构造过程被分到了几个调用中,在构造过程中JavaBean可能处于不一致的状态。

---《Effective Java》

这时我们就可以尝试使用构建器(Builder)

2.怎样使用构建器

直接看示例代码

package pub.izumi.coolqs;

public class User {
    private int id;
    private String name;
    private String phone;
    private String sex;
    private String IDCard;

    public static class Builder {
        private int id;
        private String name;
        private String phone;
        private String sex;
        private String IDCard;
        
        public Builder(int id, String name) {
            this.id = id;
            this.name = name;
        }
        public Builder phone(String val) {
            this.phone = val;
            return this;
        }
        public Builder sex(String val) {
            this.sex = val;
            return this;
        }
        public Builder IDCard(String val) {
            this.IDCard = val;
            return this;
        }
        public User build() {
            return new User(this);
        }
    }

    private User(Builder builder) {
        id = builder.id;
        name = builder.name;
        phone = builder.phone;
        sex = builder.sex;
        IDCard = builder.IDCard;
    }
}

builder方法在设值之后返回其本身,以便于把调用形成链接。创建对象示例:

User user1 = new User.Builder(1,"izumi").build();
User user2 = new User.Builder(1,"izumi").sex("男").phone("保密").build();

运行结果.png

最后修改:2020 年 04 月 03 日 09 : 31 PM
如果觉得我的文章对你有用,请随意赞赏