这是Joshua Bloch的一篇文章,他很好地解释了为什么、何时以及如何使用构建器:
http://www.informit.com/articles/article.aspx?p=1216151&seqNum=2
这是他的一本名为Effective Java的书中的其中一项内容。如果你有一点Java经验,我强烈建议你阅读这本书。
主要观点:
当您获得一个具有许多属性的类时,有几种方法可以创建对象并对其进行初始化。
如果您逐个设置每个属性,则可能会很冗长,并且在创建后可能会更改对象。使用此方法,无法使类不可变,并且您无法确定对象处于一致状态。
来自文章的示例:
public class NutritionFacts {
private int servingSize = -1;
private int servings = -1;
private int calories = 0;
private int fat = 0;
private int sodium = 0;
private int carbohydrate = 0;
public NutritionFacts() { }
public void setServingSize(int val) { servingSize = val; }
public void setServings(int val) { servings = val; }
public void setCalories(int val) { calories = val; }
public void setFat(int val) { fat = val; }
public void setSodium(int val) { sodium = val; }
public void setCarbohydrate(int val) { carbohydrate = val; }
}
你可以使用可伸缩构造函数。它可以使你的对象不可变。但是,如果你有很多属性,编写和阅读代码可能会很困难。此外,当你只想创建一个已设置属性的对象时,不幸的是这个属性是构造函数的最后一个参数,你仍然必须设置所有参数。
文章中的示例:
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public NutritionFacts(int servingSize, int servings) {
this(servingSize, servings, 0);
}
public NutritionFacts(int servingSize, int servings,
int calories) {
this(servingSize, servings, calories, 0);
}
public NutritionFacts(int servingSize, int servings,
int calories, int fat) {
this(servingSize, servings, calories, fat, 0);
}
public NutritionFacts(int servingSize, int servings,
int calories, int fat, int sodium) {
this(servingSize, servings, calories, fat, sodium, 0);
}
public NutritionFacts(int servingSize, int servings,
int calories, int fat, int sodium, int carbohydrate) {
this.servingSize = servingSize;
this.servings = servings;
this.calories = calories;
this.fat = fat;
this.sodium = sodium;
this.carbohydrate = carbohydrate;
}
}
建造者模式可以使您的代码更易读和编写。它还使您能够使您的类不可变。
来自文章的示例:
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public static class Builder {
private final int servingSize;
private final int servings;
private int calories = 0;
private int fat = 0;
private int carbohydrate = 0;
private int sodium = 0;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val)
{ calories = val; return this; }
public Builder fat(int val)
{ fat = val; return this; }
public Builder carbohydrate(int val)
{ carbohydrate = val; return this; }
public Builder sodium(int val)
{ sodium = val; return this; }
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}
在您的示例中,我不确定为仅具有两个属性的类建立构建器是否非常有用。
我希望这可以帮助您。
User
是可变的,因此使用构建者与使用 setter 方法相比没有太大区别。 - shmosel