您的位置:首页 > 产品设计 > UI/UE

《Effective Java》Builder

2016-03-09 22:30 375 查看
试想一下,如果现在有这样的一个方法,需要你调用。


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();


这样既能避免小明的不易读的问题,又能够避免小方的安全,以及不一致性的问题,当出现不一致性的时候后台必然是会出现对应的报错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java