[Effective Java 读书笔记] 第二章 创建和销毁对象 第二条

第二条 遇到多个构造器参数时,可以考虑用构建器

    当遇到有多个构造器参数时,常见的是用重叠构造器,即:

public class TestClass{
    public TestClass(int para0){
        this(para0,0);
    }    
    public TestClass(int para0,int para1){
        this(para0,para1,0);
    }  
    public TestClass(int para0,int para1,int para2){
       this.para0 = para0;
       this.para1 = para1;
       this.para2 = para2;
    }                 
} 

  当需要的参数多了以后,上述方法难以阅读,参数含义不太明显,一长串类型相同的参数也容易有微妙的错误,比如颠倒等。

  而如果使用JavaBeans模式,即为每个参数创建一个setter的方法,这样可读性提高,每个参数的设置都有含义,但是整个构建方法被分为几个调用,导致构建过程中处于不一致的状态,需要额外保证线程安全

  推荐使用 Builder模式,抄了网上的一个代码段:

   

public class DoDoContact {
    private final int    age;
    private final int    safeID;
    private final String name;
    private final String address;
 
    public int getAge() {
        return age;
    }
 
    public int getSafeID() {
        return safeID;
    }
 
    public String getName() {
        return name;
    }
 
    public String getAddress() {
        return address;
    }
 
    public static class Builder {
        private int    age     = 0;
        private int    safeID  = 0;
        private String name    = null;
        private String address = null;

   // 构建的步骤
        public Builder(String name) {
            this.name = name;
        }
 
        public Builder age(int val) {
            age = val;
            return this;
        }
 
        public Builder safeID(int val) {
            safeID = val;
            return this;
        }
 
        public Builder address(String val) {
            address = val;
            return this;
        }
 
        public DoDoContact build() { // 构建,返回一个新对象
            return new DoDoContact(this);
        }
    }
 
    private DoDoContact(Builder b) {
        age = b.age;
        safeID = b.safeID;
        name = b.name;
        address = b.address;
 
    }
}

//调用:
  DoDoContact ddc = new DoDoContact.Builder("Ace").age(10)
                .address("beijing").build();
 

 

    

 

posted @ 2015-08-23 21:04  jiangz222  阅读(173)  评论(0编辑  收藏  举报