不管是构造方法还是静态工厂方法,都存在一个问题,就是在创建对象时要传入n多参数,这次要说的是使用构造器。
举个例子说明这样做的好处,先看使用构造方法的情况:
public class Person {
private String name; // 必须
private boolean gender; // 必须
private int age; // 可选
private int height; // 可选
private int weight; // 可选
private String description; // 可选
public Person(String name, boolean gender) {
this(name, gender, 18);
}
public Person(String name, boolean gender, int age) {
this(name, gender, age, 170);
}
public Person(String name, boolean gender, int age, int height) {
this(name, gender, age, height, 50);
}
public Person(String name, boolean gender, int age, int height, int weight) {
this(name, gender, age, height, weight, "");
}
public Person(String name, boolean gender, int age, int height, int weight, String description) {
this.name = name;
this.gender = gender;
this.age = age;
this.height = height;
this.weight = weight;
this.description = description;
}
}
调用的时候,我们可能会使用:
Person p = new Person("Sirius",false,25,165,50,"a cute girl");
如果我们只是想设置简介,也必须要把6个参数全都输入,很恶心的,这样既不便于书写,也不便于阅读。
好了,看看构造器的强大吧,把上面的代码写成构造器的方式:
public class Person {
private String name; // 必须
private boolean gender; // 必须
private int age; // 可选
private int height; // 可选
private int weight; // 可选
private String description; // 可选
public static class Builder {
// 必须
private String name;
private boolean gender;
// 可选,设置默认值
private int age = 18;
private int height = 170;
private int weight = 50;
private String description = "";
public Builder(String name, boolean gender) {
this.name = name;
this.gender = gender;
}
public Builder age(int val){
age = val;
return this;
}
public Builder height(int val){
height = val;
return this;
}
public Builder weight(int val){
weight = val;
return this;
}
public Builder description(String val){
description = val;
return this;
}
public Person build() {
return new Person(this);
}
}
private Person(Builder builder) {
this.name = builder.name;
this.gender = builder.gender;
this.age = builder.age;
this.height = builder.height;
this.weight = builder.weight;
this.description = builder.description;
}
}
貌似比刚才复杂了一些,看看调用的时候吧
Person p = new Person.Builder("Sirius", false).age(25).height(165).description("a cute girl"),build();
好多了吧,清晰明了,用到哪个就写哪个,多方便啊。