当前位置:编程学习 > JAVA >>

Java学习笔记(二)の遇到多个构造器参数时要考虑用构建器

静态工厂和构造器有个共同的局限性:它们都不能很好地扩展到大量的可选参数。考虑用一个类表示包装食品外面显示的营养成分标签。这些标签中有几个域是必须的:每份的含量、每罐的含量以及每份的卡路里,还有超过20哥可选域:总脂肪量、饱和脂肪量、转化脂肪、胆固醇、钠等等。大多数产品在某几个可选域中都会有非零的值。

对于这样的类,应该用哪种构造器或者静态方法来编写呢?

1.重叠构造器模式


[java] // Telescoping constructor pattern - does not scale well!    
 
public class NutritionFacts { 
    private final int servingSize;   // (mL)            required  
    private final int servings;      // (per container) required  
    private final int calories;      //                 optional  
    private final int fat;           // (g)             optional  
    private final int sodium;        // (mg)            optional  
    private final int carbohydrate;  // (g)             optional  
 
    public NutritionFacts(int servingSize, int servings) { 
        this(servingSize, servings, 0); 
    } 
 
    public NutritionFacts(int servingSize, int servings, 
            int calories) { 
        this(servingSize, servings, calories, 0); 
    } 
 
    public NutritionFacts(int servingSize, int servings, 
            int calories, int fat) { 
        this(servingSize, servings, calories, fat, 0); 
    } 
 
    public NutritionFacts(int servingSize, int servings, 
            int calories, int fat, int sodium) { 
        this(servingSize, servings, calories, fat, sodium, 0); 
    } 
 
    public NutritionFacts(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; 
    } 
 
    public static void main(String[] args) { 
        NutritionFacts cocaCola = 
            new NutritionFacts(240, 8, 100, 0, 35, 27); 
    } 

// Telescoping constructor pattern - does not scale well! 

public class NutritionFacts {
    private final int servingSize;   // (mL)            required
    private final int servings;      // (per container) required
    private final int calories;      //                 optional
    private final int fat;           // (g)             optional
    private final int sodium;        // (mg)            optional
    private final int carbohydrate;  // (g)             optional

    public NutritionFacts(int servingSize, int servings) {
        this(servingSize, servings, 0);
    }

    public NutritionFacts(int servingSize, int servings,
            int calories) {
        this(servingSize, servings, calories, 0);
    }

    public NutritionFacts(int servingSize, int servings,
            int calories, int fat) {
        this(servingSize, servings, calories, fat, 0);
    }

    public NutritionFacts(int servingSize, int servings,
            int calories, int fat, int sodium) {
        this(servingSize, servings, calories, fat, sodium, 0);
    }

    public NutritionFacts(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;
    }

    public static void main(String[] args) {
        NutritionFacts cocaCola =
            new NutritionFacts(240, 8, 100, 0, 35, 27);
    }
}2.JavaBeans模式


[java] // Telescoping constructor pattern - does not scale well!    
 
public class NutritionFacts { 
    private final int servingSize;   // (mL)            required  
    private final int servings;      // (per container) required  
    private final int calories;      //                 optional 

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,