昨晚做测试的时候需要一个测试对象,于是创建了一个Person,如下:
public class Person implements Serializable{
private final int age;
private final String name;
private int weight;
private String sex;
.....
}
可见这个对象的域有多么的多,如果在构造函数中进行赋值,或者实例化后通过setter赋值,都是件十分麻烦的事,于是便想到了Effective Java中通过创建内部类Builder来构造实例:
public static class Builder {
// 必须
private final int age;
private final String name;
// 非必须
private String sex = "";
private int weight = 0;
public Builder (int age, String name){
this.age = age;
this.name = name;
}
public Builder sex (String val){
sex = val;
return this;
}
public Builder weight (int val){
weight = val;
return this;
}
public Person build (){
return new Person(this);
}
}
这样一来就能很方便到选择需要的参数进行赋值了:
Person person = new Person.Builder(20, "张三").sex("男").weight(140).build();
很清晰吧,下面是完整代码:
public class Person implements Serializable{
private static final long serialVersionUID = 7037233268790765128L;
private final int age;
private final String name;
private final String sex;
private final int weight;
private Person (Builder builder){
age = builder.age;
name = builder.name;
sex = builder.sex;
weight = builder.weight;
}
public static class Builder {
// 必须
private final int age;
private final String name;
// 非必须
private String sex = "";
private int weight = 0;
public Builder (int age, String name){
this.age = age;
this.name = name;
}
public Builder sex (String val){
sex = val;
return this;
}
public Builder weight (int val){
weight = val;
return this;
}
public Person build (){
return new Person(this);
}
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public String getSex() {
return sex;
}
public int getWeight() {
return weight;
}
@Override
public String toString() {
return "Person [age=" + age + ", name=" + name + ", sex=" + sex
+ ", weight=" + weight + "]";
}
}