读《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();



posted on 2009-12-17 20:25 胡鹏 阅读(537) 评论(0)  编辑  收藏 所属分类: java基础读《effective java》笔记


只有注册用户登录后才能发表评论。


网站导航:
 

导航

<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

统计

常用链接

留言簿(3)

随笔分类

随笔档案

agile

搜索

最新评论

阅读排行榜

评论排行榜