effective java--遇到多个构造器参数最好使用Builder模式

来源:互联网 发布:mac蓝屏之后开不了机了 编辑:程序博客网 时间:2024/05/25 16:41

上次说用静态工厂方法来代替构造器,好处有几点:

1、静态工厂方法有名称,你可以通过命名使其更有意义 

2、使用静态工厂方法之后不必每次调用的时候都创建一个新的对象(静态工厂方法是static修饰的方法,其对象在程序第一次加载的时候就已经在内存中了,直到程序结束该内存才会释放

3、静态工厂方法可以返回原返回类型的任何子类型的对象(这个还在研究中)

但是在遇到多个构造器参数,或者参数一开始无法确定的时候,无论用静态工厂方法或者构造器都是一件麻烦的事情,创造者必须要提供多个方法或者构造器,而且调用的时候还要小心看清每个参数。或者会选择用javabean模式(就是调用无参构造器,然后不断set值),但是这有个缺点:调用过程中javabean可能处于不一致的状态。

这时候你可以考虑Builder模式,它的参数可以再创建对象期间进行调整,也可随对象不同而改变,具体的列子可以看转自这位up主的代码

http://www.cnblogs.com/moonz-wu/archive/2011/01/11/1932473.html

不想去原博客看得可以看下面从他拿那到的例子:ps(在builder里给参数赋值的时候我发现我自己测试没有指明this的话会赋值失败,所以我自己加上了this,还有这里涉及成员内部类的知识,可以看这里http://android.blog.51cto.com/268543/384844/)

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) {            this.age = val;            return this;        }         public Builder safeID(int val) {            this.safeID = val;            return this;        }         public Builder address(String val) {            this.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();System.out.println("name=" + ddc.getName() + "age =" + ddc.getAge()                + "address" + ddc.getAddress());

 
阅读全文
0 0
原创粉丝点击