今天发现好像代码艺术也基本看完了,就重新翻开了Effective Java
静态工厂方法代替构造器
public class Demo {
private final String field1;
private Demo(String field1) {
this.field1 = field1;
}
public static Demo of(String field1) {
return new Demo(field1);
}
}
静态工厂方法的几个优势:
-
有名称
这个我觉得是静态工厂方法构造器的最大优势了。书中还列举了几个比较常用的名字
-
from:单个参数的时候用到
Date d = Date.from(instant);
-
of:多个参数的时候使用,这个是我自己最常用的,不管几个参数都是of
-
getInstance/newInstance
具体区别其实没有必要深究,意思也差不多
-
-
不必每次都会创建对象
比如Boolean.parseBoolean(),只会返回Boolean类里面的常量
-
可以返回类型的任何子类型对象
构造器
构造器其实已经讨论过了。它适合用于构造函数的参数比较多的时候。
对于接口消息记录,我自己比较支持使用构造器。对于我自己,我每次需要的知识其中的几个方法,而且好像有一些是可以有默认值的。它的构造方法至少都是6,7个参数,这对于使用来说非常的麻烦,需要一个一个对字段。如果说多参数构造方法是为了保证必填字段都有值的话,可以在builde方法里面加校验,让测试跑不通过。甚至可以不加校验,如果真的有问题,使用过程中就会发现。
优先考虑依赖注入引用资源
就是如果一个service依赖了另外一个service,不要直接在class里面进行创建,应该将另外一个service作为构造方法的参数传入,这样可以使用到多态。
我们的代码里经常课件这种:
public class Service {
private Dao dao;
private Dao getDao() {
if (this.dao == null) {
this.dao = new Dao();
}
return this.dao;
}
public void process() {
this.getDao();
.....
}
}
这种代码其实是比较想吐槽的,service本身是个单例,这么做其实不就是把明明不是单例的Dao变成了单例了。而且我比较反对,对于一个一定会被使用到的单例用饿汉式方法实现。
这里面还不如把Dao也变成Bean,然后Autowired
网友评论