Effective Java (2) 碰着多个结构器参数时要思量用构建器
当前位置:以往代写 > JAVA 教程 >Effective Java (2) 碰着多个结构器参数时要思量用构建器
2019-06-14

Effective Java (2) 碰着多个结构器参数时要思量用构建器

Effective Java (2) 碰着多个结构器参数时要思量用构建器

副标题#e#

一、配景

对付有多个可选参数的类,我们一般通过什么步伐通报参数呢?这里提供了三种步伐:

①. 重叠结构器模式

②. JavaBeans模式

③. Builder构建器模式

下面我们来阐明一下以上三种要领的优势及漏洞。

二、重叠结构器模式

重叠结构器模式中第一个结构器中只有须要参数,第二个结构器有一个可选参数,第三个结构器中有两个可选参数,依次类推,最后一个结构器中包括所有可选参数。这种方案可行,可是有较大缺陷。

缺点:当有许多可选参数的时候,客户端代码很难编写,并难以阅读,假如客户端不小心颠倒了个中两个参数的顺序,编译器也不会报错,可是措施在运行时会呈现错误的行为。

/* 
 * 结构器模式 
 */
public class NutritionFacts1 {  
    private int a1; // 必需  
    private int a2; // 必需  
    private int a3; // 可选  
    private int a4; // 可选  
      
    public NutritionFacts1(int a1, int a2) {  
        this(a1, a2, 0);  
    }  
      
    public NutritionFacts1(int a1, int a2, int a3) {  
        this(a1, a2, 0, 0);  
    }  
      
    public NutritionFacts1(int a1, int a2, int a3, int a4) {  
        this.a1 = a1;  
        this.a2 = a2;  
        this.a3 = a3;  
        this.a4 = a4;  
    }  
      
    public int getA1() {  
        return a1;  
    }  
      
    public void setA1(int a1) {  
        this.a1 = a1;  
    }  
      
    public int getA2() {  
        return a2;  
    }  
      
    public void setA2(int a2) {  
        this.a2 = a2;  
    }  
      
    public int getA3() {  
        return a3;  
    }  
      
    public void setA3(int a3) {  
        this.a3 = a3;  
    }  
      
    public int getA4() {  
        return a4;  
    }  
      
    public void setA4(int a4) {  
        this.a4 = a4;  
    }  
          
    public String toString() {  
        return a1 + "-" + a2 + "-" + a3 + "-" + a4;  
    }  
      
    public static void main(String[] args) {  
        NutritionFacts1 nf = new NutritionFacts1(1, 2, 3, 4);  
        System.out.println(nf);  
    }  
}

查察本栏目


#p#副标题#e#

三、JavaBeans模式

JavaBeans模式中挪用一个无参的结构器来建设工具,然后挪用setter要领来配置每个须要的参数。

缺点:结构进程被分到了几个挪用中,在结构进程中JavaBean大概处于纷歧致的状态,同时在结构进程中JavaBean大概处于纷歧致的状态,需要支付特别尽力确保线程安详。

/* 
 * JavaBeans模式 
 */
public class NutritionFacts2 {  
    private int a1 = -1;  
    private int a2 = -1;  
    private int a3;  
    private int a4;  
      
    public NutritionFacts2() {  
      
    }  
      
    public int getA1() {  
        return a1;  
    }  
      
    public void setA1(int a1) {  
        this.a1 = a1;  
    }  
      
    public int getA2() {  
        return a2;  
    }  
      
    public void setA2(int a2) {  
        this.a2 = a2;  
    }  
      
    public int getA3() {  
        return a3;  
    }  
      
    public void setA3(int a3) {  
        this.a3 = a3;  
    }  
      
    public int getA4() {  
        return a4;  
    }  
      
    public void setA4(int a4) {  
        this.a4 = a4;  
    }  
      
    public static void main(String[] args) {  
        NutritionFacts2 nf = new NutritionFacts2();  
        nf.setA1(1);  
        nf.setA2(2);  
        nf.setA3(3);  
        nf.setA4(4);  
    }  
}

四、Builder构建器模式

最优方案:既能担保像结构器模式那样的安详性,也能担保像JavaBeans模式那么好的可读性

①. 不直接生成想要的工具,而是让客户端操作所有须要的参数挪用结构器,获得一个builder工具。

②. 客户端在builder工具上挪用雷同setter的要领来配置每个相关的可选参数。

③. 客户端挪用无参的build要领来生成不行变的工具,这个builder是它构建的类的静态成员类。

/* 
 * Builder模式 
 */
public class NutritionFacts3 {  
    private int a1; // 必需  
    private int a2; // 必需  
    private int a3; // 可选  
    private int a4; // 可选  
      
    public static class Builder {  
        private int a1; // 必需  
        private int a2; // 必需  
        private int a3 = 0; // 可选  
        private int a4 = 0; // 可选  
      
        public Builder(int a1, int a2) {  
            this.a1 = a1;  
            this.a2 = a2;  
        }  
      
        public Builder setA3(int a3) {  
            this.a3 = a3;  
            return this;  
        }  
      
        public Builder setA4(int a4) {  
            this.a4 = a4;  
            return this;  
        }  
      
        public NutritionFacts3 build() {  
            return new NutritionFacts3(this);  
        }  
      
    }  
      
    private NutritionFacts3(Builder builder) {  
        this.a1 = builder.a1;  
        this.a2 = builder.a2;  
        this.a3 = builder.a3;  
        this.a4 = builder.a4;  
    }  
      
    public String toString() {  
        return a1 + "-" + a2 + "-" + a3 + "-" + a4;  
    }  
      
    public static void main(String[] args) {  
        NutritionFacts3 nf = new NutritionFacts3.Builder(1, 2).build();  
        System.out.println(nf);  
    }  
}

作者:csdn博客 zdp072

    关键字:

在线提交作业