读《effective java》第二版,实用一,遇到多个构造器参数时要考虑用构造器
第二条 遇到多个构造器参数时要考虑用构造器
这里考虑的是参数多的情况,如果参数个数比较少,那直接采用一般的构造方法就可以了。
书中介绍了写构造方法的时候几种方式:
1. 重叠构造方法模式:
缺点:有许多参数的时候,客户端代码会很难写,而且较难以阅读。
2. javaBeans模式:
缺点:
在构造过程中JavaBean可能处于不一致的状态,类本身无法判断是否有效性。
类做成不可变的可能。
3. builder模式:
优点:
在build方法生成对象的时候,可以做检查,判断是否符合要求
参数灵活
缺点:
创建对象必须先创建构造器,如果对性能要求非常高的应用少用为妙
具体实现代码:
1.重叠构造方法模式:
2. javaBeans模式 代码:
3. builder模式
这个调用的时候:
NutritionFacts cocaCola = new NutritionFacts.Builder(11,22).calories(1).fat(2).calories(3).build();
这里考虑的是参数多的情况,如果参数个数比较少,那直接采用一般的构造方法就可以了。
书中介绍了写构造方法的时候几种方式:
1. 重叠构造方法模式:
缺点:有许多参数的时候,客户端代码会很难写,而且较难以阅读。
2. javaBeans模式:
缺点:
在构造过程中JavaBean可能处于不一致的状态,类本身无法判断是否有效性。
类做成不可变的可能。
3. builder模式:
优点:
在build方法生成对象的时候,可以做检查,判断是否符合要求
参数灵活
缺点:
创建对象必须先创建构造器,如果对性能要求非常高的应用少用为妙
具体实现代码:
1.重叠构造方法模式:
public
class
NutritionFacts {
private final int servingSize;
private final int serviings;
private final int calories;
private final int fat;
private int sodium;
private int carbohydrate;
public NutritionFacts( int servingSize, int serviings){
this (servingSize, serviings, 0 );
}
public NutritionFacts( int servingSize, int serviings, int calories){
this (servingSize, serviings, calories, 0 );
}
public NutritionFacts( int servingSize, int serviings, int calories, int fat){
this (servingSize, serviings, calories, fat, 0 );
}
public NutritionFacts( int servingSize, int serviings, int calories, int fat, int sodium){
this (servingSize, serviings, calories, fat, sodium, 0 );
}
public NutritionFacts( int servingSize, int serviings, int calories, int fat, int sodium, int carbohydrate){
this .servingSize = servingSize;
this .serviings = serviings;
this .calories = calories;
this .fat = fat;
this .sodium = sodium;
this .carbohydrate = carbohydrate;
}
}
private final int servingSize;
private final int serviings;
private final int calories;
private final int fat;
private int sodium;
private int carbohydrate;
public NutritionFacts( int servingSize, int serviings){
this (servingSize, serviings, 0 );
}
public NutritionFacts( int servingSize, int serviings, int calories){
this (servingSize, serviings, calories, 0 );
}
public NutritionFacts( int servingSize, int serviings, int calories, int fat){
this (servingSize, serviings, calories, fat, 0 );
}
public NutritionFacts( int servingSize, int serviings, int calories, int fat, int sodium){
this (servingSize, serviings, calories, fat, sodium, 0 );
}
public NutritionFacts( int servingSize, int serviings, int calories, int fat, int sodium, int carbohydrate){
this .servingSize = servingSize;
this .serviings = serviings;
this .calories = calories;
this .fat = fat;
this .sodium = sodium;
this .carbohydrate = carbohydrate;
}
}
2. javaBeans模式 代码:
public
class
NutritionFacts {
private int servingSize;
private int serviings;
private int calories;
private int fat;
private int sodium;
private int carbohydrate;
public NutritionFacts(){}
public void setServingSize( int servingSize) {
this .servingSize = servingSize;
}
public void setServiings( int serviings) {
this .serviings = serviings;
}
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;
}
private int servingSize;
private int serviings;
private int calories;
private int fat;
private int sodium;
private int carbohydrate;
public NutritionFacts(){}
public void setServingSize( int servingSize) {
this .servingSize = servingSize;
}
public void setServiings( int serviings) {
this .serviings = serviings;
}
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;
}
3. builder模式
public
class
NutritionFacts {
private final int servingSize;
private final int serviings;
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 serviings;
// 可以为空
private int calories = 0 ;
private int fat = 0 ;
private int sodium = 0 ;
private int carbohydrate = 0 ;
public Builder( int servingSize, int serviings) {
this .servingSize = servingSize;
this .serviings = serviings;
}
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 NutritionFacts build(){
return new NutritionFacts( this );
}
}
public NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
serviings = builder.serviings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}
private final int servingSize;
private final int serviings;
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 serviings;
// 可以为空
private int calories = 0 ;
private int fat = 0 ;
private int sodium = 0 ;
private int carbohydrate = 0 ;
public Builder( int servingSize, int serviings) {
this .servingSize = servingSize;
this .serviings = serviings;
}
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 NutritionFacts build(){
return new NutritionFacts( this );
}
}
public NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
serviings = builder.serviings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}
NutritionFacts cocaCola = new NutritionFacts.Builder(11,22).calories(1).fat(2).calories(3).build();