本篇內(nèi)容來(lái)自于個(gè)人在學(xué)習(xí)《effective java》一書(shū)時(shí)的理解咕痛,記錄下自己的學(xué)習(xí)情況
1. 重疊構(gòu)造器
public class NutritionFactsConstructor {
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 NutritionFactsConstructor(int servingSize, int servings){
this(servingSize, servings, 0);
}
public NutritionFactsConstructor(int servingSize, int servings, int calories){
this(servingSize, servings, calories, 0);
}
public NutritionFactsConstructor(int servingSize, int servings, int calories, int fat){
this(servingSize, servings, calories, fat, 0);
}
public NutritionFactsConstructor(int servingSize, int servings, int calories, int fat, int sodium){
this(servingSize, servings, calories, fat, sodium, 0);
}
public NutritionFactsConstructor(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;
}
}
缺點(diǎn): 在使用時(shí)簿姨,當(dāng)選擇在參數(shù)列表中位置靠后的可選參數(shù)時(shí)距误,必須同時(shí)給必選參數(shù)和選擇的最后一個(gè)可選參數(shù)之間的無(wú)關(guān)參數(shù)賦值。
測(cè)試:
NutritionFactsConstructor n1 = new NutritionFactsConstructor(1, 1);
NutritionFactsConstructor n2 = new NutritionFactsConstructor(1, 2, 6);
NutritionFactsConstructor n3 = new NutritionFactsConstructor(1, 3, 0, 5);
System.out.println("n1 = " + n1 + "\nn2 = " + n2 + "\nn3 = " + n3);
------------------------------------------------------------------------------------------------
輸出:
n1 = NutritionFactsConstructor{servingSize=1, servings=1, calories=0, fat=0, sodium=0, carbohydrate=0}
n2 = NutritionFactsConstructor{servingSize=1, servings=2, calories=6, fat=0, sodium=0, carbohydrate=0}
n3 = NutritionFactsConstructor{servingSize=1, servings=3, calories=0, fat=5, sodium=0, carbohydrate=0}
2. JavaBeans
public class NutritionFactsJavaBeans {
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 NutritionFactsJavaBeans(int servingSize, int servings){
this.servingSize = servingSize;
this.servings = servings;
}
@Override
public String toString() {
return "NutritionFactsJavaBeans{" +
"servingSize=" + servingSize +
", servings=" + servings +
", calories=" + calories +
", fat=" + fat +
", sodium=" + sodium +
", carbohydrate=" + carbohydrate +
'}';
}
public int getServingSize() {
return servingSize;
}
public void setServingSize(int servingSize) {
this.servingSize = servingSize;
}
public int getServings() {
return servings;
}
public void setServings(int servings) {
this.servings = servings;
}
public int getCalories() {
return calories;
}
public void setCalories(int calories) {
this.calories = calories;
}
public int getFat() {
return fat;
}
public void setFat(int fat) {
this.fat = fat;
}
public int getSodium() {
return sodium;
}
public void setSodium(int sodium) {
this.sodium = sodium;
}
public int getCarbohydrate() {
return carbohydrate;
}
public void setCarbohydrate(int carbohydrate) {
this.carbohydrate = carbohydrate;
}
}
特點(diǎn):通過(guò)構(gòu)造器給必選參數(shù)賦值扁位,然后使用setter方法來(lái)給需要的可選參數(shù)賦值准潭。
缺點(diǎn):該種方法無(wú)法實(shí)現(xiàn)類的不可變性。
測(cè)試:
NutritionFactsJavaBeans n1 = new NutritionFactsJavaBeans(1, 1);
n1.setFat(1);
n1.setCarbohydrate(5);
System.out.println(n1);
------------------------------------------------------------------------------------------------
輸出:
NutritionFactsJavaBeans{servingSize=1, servings=1, calories=0, fat=1, sodium=0, carbohydrate=5}
3. 構(gòu)建器
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;
private NutritionFactsBuilder(Builder builder){
this.servingSize = builder.servingSize;
this.servings = builder.servings;
this.calories = builder.calories;
this.fat = builder.fat;
this.sodium = builder.sodium;
this.carbohydrate = builder.carbohydrate;
}
@Override
public String toString() {
return "NutritionFactsBuilder{" +
"servingSize=" + servingSize +
", servings=" + servings +
", calories=" + calories +
", fat=" + fat +
", sodium=" + sodium +
", carbohydrate=" + carbohydrate +
'}';
}
public static class Builder{
private final int servingSize;
private final int servings;
private int calories;
private int fat;
private int sodium;
private int carbohydrate;
public Builder(int servingSize, int servings){
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int value){
this.calories = value;
return this;
}
public Builder fat(int value){
this.fat = value;
return this;
}
public Builder sodium(int value){
this.sodium = value;
return this;
}
public Builder carbohydrate(int value){
this.carbohydrate = value;
return this;
}
public NutritionFactsBuilder build(){
return new NutritionFactsBuilder(this);
}
}
}
特點(diǎn):先實(shí)例化靜態(tài)內(nèi)部類的對(duì)象域仇,設(shè)定好參數(shù)后再通過(guò)build方法調(diào)用外部類的構(gòu)造器從而返回外部類的對(duì)象刑然。在使用方法上具有非常好的可讀性。
缺點(diǎn):在非常追求性能優(yōu)化時(shí)暇务,靜態(tài)內(nèi)部類可能會(huì)影響性能泼掠。
測(cè)試:
NutritionFactsBuilder n1 = new NutritionFactsBuilder.Builder(1, 1).calories(1).carbohydrate(1).build();
NutritionFactsBuilder n2 = new NutritionFactsBuilder.Builder(2,2).fat(1).sodium(1).build();
System.out.println(n1);
System.out.println(n2);
------------------------------------------------------------------------------------------------
輸出:
NutritionFactsBuilder{servingSize=1, servings=1, calories=1, fat=0, sodium=0, carbohydrate=1}
NutritionFactsBuilder{servingSize=2, servings=2, calories=0, fat=1, sodium=1, carbohydrate=0}