多个构造器参数可以这样优化
一、重叠构造器
/**
* Created by 邱林锋 on 2019/5/31.
*/
public class NutritionFactsOne {
private final int id;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public NutritionFactsOne(int servingSize, int servings) {
this(servingSize, servings, 0);
}
public NutritionFactsOne(int servingSize, int servings, int calories) {
this(servingSize, servings, calories, 0);
}
public NutritionFactsOne(int servingSize, int servings, int calories, int fat) {
this(servingSize, servings, calories, fat, 0);
}
public NutritionFactsOne(int servingSize, int servings, int calories, int fat, int sodium) {
this(servingSize, servings, calories, fat, sodium, 0);
}
public NutritionFactsOne(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;
}
}
缺点:参数多的无法控制,可读性不好,有时候不知道那个对应哪个参数了。
/**
* Created by 邱林锋 on 2019/5/31.
*/
public class Test {
public void test (){
NutritionFactsOne nutritionFactsOne = new NutritionFactsOne(240,8,100,0,35,27);
}
}
二、setting的方法,这个是最常用的
/**
* Created by 邱林锋 on 2019/5/31.
*/
public class NutritionFactsSet {
private int servingSize = 0;
private int servings = 0;
private int calories = 0;
private int fat = 0;
private int sodium = 0;
private int carbohydrate = 0;
public NutritionFactsSet() {
}
public void setServingSize(int servingSize) {
this.servingSize = servingSize;
}
public void setServings(int servings) {
this.servings = servings;
}
public void setCalories(int calories) {
this.calories = calories;
}
public void setFat(int fat) {
this.fat = fat;
}
public void setSodium(int sodium) {
this.sodium = sodium;
}
public void setCarbohydrate(int carbohydrate) {
this.carbohydrate = carbohydrate;
}
}
/**
* Created by 邱林锋 on 2019/5/31.
*/
public class Test {
public void test (){
NutritionFactsSet nutritionFactsSet = new NutritionFactsSet();
nutritionFactsSet.setServingSize(240);
nutritionFactsSet.setServings(8);
nutritionFactsSet.setCalories(100);
nutritionFactsSet.setFat(0);
nutritionFactsSet.setSodium(35);
nutritionFactsSet.setCarbohydrate(27);
}
}
三、Builder模式
/**
* Created by 邱林锋 on 2019/5/31.
*/
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) {
this.calories = val;
return this;
}
public Builder fat(int val) {
this.fat = val;
return this;
}
public Builder carbohydrate(int val) {
this.carbohydrate = val;
return this;
}
public Builder sodium(int val) {
this.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;
}
}
/**
* Created by 邱林锋 on 2019/5/31.
*/
public class Test {
public void test (){
NutritionFacts nutritionFacts = new NutritionFacts
.Builder(240,0)
.calories(100)
.fat(0)
.sodium(35)
.carbohydrate(27)
.build();
}
}
Builder模式代码易于阅读和编写