您的位置:首页 > Web前端

Effective Java 第二条:遇到多个构造器参数时要考虑用构建器

2016-04-10 00:28 507 查看
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">对于Java处理多参数时,先给大家上两个程序员平时最喜爱用的写法:</span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">
</span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">第一:重叠构造器</span>


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 servings, int servingSize, int caloriesm, int fat) {
this(servings,servingSize,caloriesm,fat,0);
}

public NutritionFacts(int calories, int fat, int servings, int servingSize, int sodium) {
this(calories,fat,servings,servingSize,sodium,0);
}

public NutritionFacts(int calories, int servingSize, int servings, int fat, int sodium, int carbohydrate) {
this.calories = calories;
this.servingSize = servingSize;
this.servings = servings;
this.fat = fat;
this.sodium = sodium;
this.carbohydrate = carbohydrate;
}
}


客户端调用:

NutritionFacts facts = new NutritionFacts(12,34,2,5,3,5);


第二:JavaBean模式

public class NutritionFactsJavaBean {  //JavaBean模式
private  int servingSize;
private  int servings;
private  int calories;
private  int fat;
private  int sodium;
private  int carbohydrate;

public NutritionFactsJavaBean() {
}

public void setCalories(int calories) {
this.calories = calories;
}

public void setCarbohydrate(int carbohydrate) {
this.carbohydrate = carbohydrate;
}

public void setFat(int fat) {
this.fat = fat;
}

public void setServings(int servings) {
this.servings = servings;
}

public void setServingSize(int servingSize) {
this.servingSize = servingSize;
}

public void setSodium(int sodium) {
this.sodium = sodium;
}
}


客户端调用:

NutritionFactsJavaBean factsJavaBean = new NutritionFactsJavaBean();
factsJavaBean.setCalories(34);
factsJavaBean.setCarbohydrate(33);
factsJavaBean.setFat(333);
factsJavaBean.setServings(345);


以上两种构造器弊端总结:重叠构造器模式可行,但是当有许多参数时,客户端代码会很难编写,难以阅读。JavaBean模式类无法仅仅通过检验构造器参数的有效性保持一致性,并且导致线程不安全。综上,遇到多参数时,统一推荐大家使用构建器,既能有重叠构造器的安全,又能有JavaBean模式的可读性。

遇到多参数,推荐使用构建器:

public class NutritionFactsBuilder { //构建器模式
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 sodium = 0;
private  int carbohydrate = 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 sodium(int val){
sodium = val;
return this;
}

public Builder carbohydrate(int val){
carbohydrate = val;
return this;
}

public NutritionFactsBuilder build(){
return new NutritionFactsBuilder(this);
}
}

private NutritionFactsBuilder(Builder builder){
servings = builder.servings;
servingSize = builder.servingSize;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}

}


客户端调用:

NutritionFactsBuilder builder = new NutritionFactsBuilder.Builder(12,34)
.calories(44)
.carbohydrate(55)
.fat(456)
.sodium(23)
.build();

以上内容整理自《Effective Java》。大家最好运行代码感受一下喔。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java Effective Java