在类中定义一个静态内部类,在这个静态内部类中定义和外部类一样的属性并提供返回内部类的一些列方法,通过这些方法给属性赋值,在内部类的构造函数中还可以同时赋属性的默认值,最后通过内部类的 build 方法将内部对象传递给外部类的私有构造方法来实例化外部类并返回给调用者;
同时还可以在外部类中提供一个静态的 builder 方法,直接实例化一个内部的 Builder 类返回,这样使用时候就可以直接 build 了,不用再 new 外部类了;
package bean;
public class User {
private int id;
private String username;
private String sex;
private String addr;
public static class Builder{
private int id;
private String username;
private String sex = "男";
private String addr;
// 无参子类构造方法
public Builder() {
}
// 给某些属性赋初值的子类构造方法
public Builder(String addr) {
this.addr = addr;
}
public Builder id(Integer id){
this.id = id;
return this;
}
public Builder username(String username){
this.username = username;
return this;
}
public Builder sex(String sex){
this.sex = sex;
return this;
}
public Builder addr(String addr){
this.addr = addr;
return this;
}
public User build(){
return new User(this);
// 或者直接在此调用父类全参的构造方法
//return new User(id, username, sex, addr);
}
}
private User(Builder builder) {
id = builder.id;
username = builder.username;
sex = builder.sex;
addr = builder.addr;
}
private User(int id, String username, String sex, String addr) {
this.id = id;
this.username = username;
this.sex = sex;
this.addr = addr;
}
// 在父类提供静态的 builder 方法返回子类
public static Builder builder(){
return new Builder();
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", sex='" + sex + '\'' +
", addr='" + addr + '\'' +
'}';
}
public static void main(String[] args) {
// 方式1
User user1 = new User.Builder().id(1).username("zhangsan").sex("男").addr("北京").build();
System.out.println("user1: " + user1.toString());
// 方式2
User user2 = User.builder().id(2).username("lisi").sex("女").addr("上海").build();
System.out.println("user2: " + user2.toString());
}
}
运行,输出:
user1: User{id=1, username='zhangsan', sex='男', addr='北京'}
user2: User{id=2, username='lisi', sex='女', addr='上海'}
注:也可以在类上通过 lombok 的 @Builder 注解实现构造器模式;