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

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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值