学习记录,也是生活的一种记录。
第一条:考虑用静态工厂方法代替构造器
我们都是有身份证的人。
静态工厂方法与构造器不同的最大优势就在于它们都是有个人身份id的,虽然构造方法能够通过改名参数类型或者参数个数等来区分,但一定意义上也会给开发带来一定的问题,因为不知道该调用哪个API,也因此常常会发生一些错误。更别说没有注释或者API文档时,那就是一种痛苦了,而静态工厂方法则不同,我们可以每个静态方法声明一个ID,而且一般的命名规则离不开对方法的总体概况,当我们调用此类方法的时候,即使没有文档或者注释的帮助,也能清楚地了解到这个方法到底是拿来做什么的。
构造方法
public Boolean(boolean b){
return b?Boolean.true:Boolean.false;
}
静态工厂方法
public static Boolean valueof(boolean b){
return b?Boolean.true:Boolean.false;
}
2.不New更高效
第二个优势在于静态方法每次调用时都不必去创建一个新的对象,相比于new()一个对象出来,而且你无法保证它不重复使用,后果就是带来高昂的开销。Effictive java说的更清楚:“静态工厂方法能够为重复的调用返回相同对象,这样有助于类总能严格控制在某个时刻哪些实例应该存在,这种类被称为实例受控的类(instance-controlled)”,避免了存在两个相等的实例,类如果保持了这一点,能有效地提升性能。过多的创建不必要的重复对象,不仅让代码变得冗余,也会给代码的互查工作带来不必要的苦恼,当然更重要的原因是它也不利于整个项目的性能。
3.返回更灵活
Effictive java 上的原话是“静态工厂方法与构造器不同的第三大优势在于,它们可以返回原返回类型的任何子类型的对象”。乍看一下有点拗口,也一时没理解。先上个实例代码
public interface Service{
...//service methods
}
public interface Provider{
Service newService();
Provider(){
//构造器
}
}
public class Services{
public static Service newInstance(){
Provider p = new Provider();
return p.newService();
}
}
对于构造器而言,返回的只能是Provider对象,而对于静态方法,它返回了Service对象,在返回类型的选择上比构造器更加灵活和多样。(在这一点上LZ可能理解地不是特别深,大家有意见或者更好的看法,欢迎大家留言,谢谢)
4.简洁就是效率
对于代码的初学者来说,
Map<String,List<String>> m = new HashMap<String,List<String>>();
一定不陌生,你会发现当你类型参数越来越长的时候,这段代码会变得非常的复杂,冗余甚至让你痛苦。但如果HashMap提供了静态工厂:
public static <K,V>HashMap<K,V> newInstance(){
return new HashMap<K,V>();
}
那你以后的声明就变成了:
Map<String,List<String>> m = HashMap.newInstance();
怎么样,代码是不是简洁很多?在大家以后创建自己常用的工具类的时候,可以参考此类方法,代码也会写的非常地漂亮,让人赏心悦目。