《Effective Java》Builder

试想一下,如果现在有这样的一个方法,需要你调用。
FunctionReality fr = Function.getReality(Date time,String place,int age, Personality p,Skill skill ...)

如果是在写代码的时候需要调用一个方法超过了5个变量需要进行值得设置。这个时候你可能心情就变得比较复杂了。
我们可以很清楚的看到,这样的传递参数的缺点:
1 首先,如此大量的参数列表,很容易,出现讲本应该填充到第一个地方的值天到了第二个地方,而编译的时候却没有报错,运行时候也没有报错,但是却得出了不同的结果。
2 再者,我们需要很仔细的去理解每一个参数到底是什么作用。
那么就上面存在的问题大家有什么好的想法呢?
小明 :老师,能不能把这些参数都组合成为一个类,然后我们就只需要传递一个对象就可以了。
老师:嗯,说的很好,那么你如何去得到这个类的实例呢。
小明:我们可以使用构造函数,例如
Parameter param = new Parameter(a,b,c,d,e)
这样的话,似乎我们就能解决了。
老师:嗯,这是个解决方案,但是,我们在阅读这样的代码的时候,怎么知道你的a b c d e的含义具体是什么呢,这是一个解决方式,但是可读性,不太好。不能见闻之意。还有没有其他的同学有别的想法?
小方:老师,我的想法和小明的有些像,就是不用构造器组对象,而是使用默认的构造器,然后去讲需要的值set进去。
老师:小方,想法很好,解决了小明的可读性差的问题,但是小方,你这样构造对象存在不连续性的问题。
比如:你在set值的时候,如果忘记set了某一个值,怎么办呢?并且还存在线程安全的问题,试想如果是多个线程,同时多个线程操作这个对象的时候,会如何呢?
还有同学有想法吗?
小红:老师,能不能在小明的类里面加上一个静态的类,然后用这个类完成对外部类的实例化构建呢。
比如:

public class Parameter{
    private String A;  // 必输项 
    private String B;  //必输项
    private String C;
    private Integer a;
    private Double b;
    private Long c;
    // set get 
    ....
    public static class Builder{
        private String A;
        private String B;
        private String C;
        public Builder  C(String C){
            this.C = C;
            return this;
        }
        ...
        public Builder(String A,String B){
            this.A = A;
            this.B = B;
        }
        public Parameter build(){
            return new Parameter(this);
        }
    }
    public Parameter(Builder builder){
        this.A = builder.A;
        this.B = builder.B;
        this.C = builder.C;
        ...
    }
}

老师这样我们在创建对象的时候,就可以直接通过下面的方式完成了
new Parameter().Builder("A","B").C("C").D("D").E("E").build();
这样既能避免小明的不易读的问题,又能够避免小方的安全,以及不一致性的问题,当出现不一致性的时候后台必然是会出现对应的报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值