在一个类有很多的值要初始化时,可以通过在构造函数中给它传初始值,例如:
这这样的构造函数给调用者带来了很多的不便,会引起调用者分不清各个参数的意义,代码也不容易读。
另外一种方法是使用JavaBean。既是在构造函数中只给出必要的初始化参数,可选参数以setter的方式来设置,例如:
但是JavaBean的形式是把初始参数各构造一个类的实例分开来完成的,但是这种形式的自由度太大,可以在任何时候改变实例的属性值。
最好的一种方式是为这样的类写一个内部的Builder。如下:
然后通过这种方式来调用:
package com.qualityeclipse.sample;
import java.util.Date;
public class Timezone {
private final float offset;
private final float asc;
private final String name;
private final String id;
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public float getOffset() {
return offset;
}
public float getAsc() {
return asc;
}
public String getName() {
return name;
}
public String getId() {
return id;
}
private Timezone(Builder builder) {
offset = builder.offset;
asc = builder.asc;
name = builder.name;
id = builder.id;
}
public static class Builder {
private float offset;
private float asc;
private String name;
private String id;
public Builder offset(float offset) {
this.offset = offset;
return this;
}
public Builder asc(float asc) {
this.asc = asc;
return this;
}
public Builder name(String name) {
this.name = name;
return this;
}
public Builder id(String id) {
this.id = id;
return this;
}
public Timezone build() {
return new Timezone(this);
}
}
}
以上内容选自:《Effective Java》第二版 英文版第11页至第15页。