您的位置:首页 > 产品设计 > UI/UE

Java 使用Builder解决构造函数参数过多的问题

2017-08-30 14:08 274 查看
Effective Java学习笔记:

  构造函数中,如果需要初始化的参数很多,那么为每种初始化方式都写一个构造函数的话,工作会过于繁重。通过使用Builder模式,可以解决构造函数中参数过多的问题。

定义一个内部类Builder,其成员变量与外部类一致;

为外部类中每一个(可选)变量各定义一个类似setter()的方法;

Builder的构造函数返回外部类的实例。

//Builder Pattern
public class NutritionFacts{
public final int servingSize;
public final int servings;
public final int calories;
public final int fat;
public final int sodium;
public final int carbohydrate;

//静态内部类Builder
public static class Builder{
//必选变量
private final int servingSize;
private final int servings;

//可选变量
private final int calories = 0;
private final int fat = 0;
private final int sodium= 0;
private final int carbohydrate= 0;

//Builder的构造函数
public Builder(int servingSize, int servings){
this
4000
. servingSize = servingSize;
this.servings = servings;
}

//Builder的成员方法返回其自身,所以可以链式调用
//类似于setter()方法
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;
}

//Builder的build方法,返回外部类的实例
public NutritionFacts build(){
return new NutritionFacts(this);
}
}

//外部类的构造函数
private NutritionFacts(Builder build){
servingSize = build.servingSize;
servings = build.servings;
calories = build.calories;
fat = build.fat;
sodium = build.sodium;
carbohydrate = build.carbohydrate;
}
}


示例:

NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).carbohydrate(27).build();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐