《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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树