一重叠构造器
public class PersonOverlap {
private final String name;
private final int age;
private final int sex;
private final String address;
public PersonOverlap(String name) {
this(name, 0, 0, "");
}
public PersonOverlap(String name, int age) {
this(name, age, 0, "");
}
public PersonOverlap(String name, int age, int sex) {
this(name, age, sex, "");
}
public PersonOverlap(String name, int age, int sex, String address) {
this.name = name;
this.age = age;
this.sex = sex;
this.address = address;
}
}
二JavaBean
public class PersonJavabean {
private String name;
private int age;
private int sex;
private String address;
public PersonJavabean() {
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setSex(int sex) {
this.sex = sex;
}
public void setAddress(String address) {
this.address = address;
}
}
三基础构建器
public class PersonBuild {
private final String name;
private final int age;
private final int sex;
private final String address;
public static class Builder {
private final String name;
private final int age;
private int sex = 0;
private String address = "";
public Builder(String name, int age) {
this.name = name;
this.age = age;
}
public Builder sex(int val) {
sex = val;
return this;
}
public Builder address(String val) {
address = val;
return this;
}
public PersonBuild build() {
return new PersonBuild(this);
}
}
private PersonBuild(Builder builder) {
name = builder.name;
age = builder.age;
sex = builder.sex;
address = builder.address;
}
@Override
public String toString() {
return "PersonBuild{" +
"name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
", address='" + address + '\'' +
'}';
}
}
//调用
PersonBuild personBuild = new PersonBuild.Builder("小李",10).sex(1).address("合肥").build();
System.out.println(personBuild.toString());
//打印
》》》PersonBuild{name='小李', age=10, sex=1, address='合肥'}
四类层次结构构建器
// Person
public abstract class Person {
public String name;
public int age;
abstract static class Builder<T extends Builder<T>> {
private String name;
private int age;
public T setNameAndAge(String name, int age) {
this.name = name;
this.age = age;
return self();
}
abstract Person build();
protected abstract T self();
}
Person(Builder<?> builder) {
name = builder.name;
age = builder.age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
// SuperMan
public class SuperMan extends Person {
private String sex;
private boolean isCanFly;
public static class Builder extends Person.Builder<Builder>{
private String sex;
private boolean isCanFly;
public Builder(String sex, boolean isCanFly){
this.sex = Objects.requireNonNull(sex);
this.isCanFly = Objects.requireNonNull(isCanFly);
}
@Override
public SuperMan build() {
return new SuperMan(this);
}
@Override
protected Builder self() {
return this;
}
}
SuperMan(Builder builder) {
super(builder);
sex = builder.sex;
isCanFly = builder.isCanFly;
}
@Override
// TODO: todo的作用就是标记,可以快速找到相关记录,从而进行下一步操作
public String toString() {
return "SuperMan{" +
"sex='" + sex + '\'' +
", isCanFly=" + isCanFly +
", name='" + name + '\'' +
", age=" + age +
'}';
}
//调用
SuperMan superMan = new SuperMan.Builder("男", true).setNameAndAge("超人",19).build();
System.out.println(superMan);
//打印
》》》SuperMan{sex='男', isCanFly=true, name='超人', age=19}
参考资料: Effective Java.