读《effective java》第二版,实用一,遇到多个构造器参数时要考虑用构造器

读《effective java》第二版,实用一,遇到多个构造器参数时要考虑用构造器

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

这里考虑的是参数多的情况,如果参数个数比较少,那直接采用一般的构造方法就可以了。


   书中介绍了写构造方法的时候几种方式:

    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;
    }
}



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;
    }


 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;
    }
}
 这个调用的时候: 
NutritionFacts cocaCola = new NutritionFacts.Builder(11,22).calories(1).fat(2).calories(3).build();



你可能感兴趣的:(读《effective java》第二版,实用一,遇到多个构造器参数时要考虑用构造器)