这一系列博客都是《Effective java》第二版的读书笔记,如果大家想深入了解的话建议读一读原书。
第二章 创建和销毁对象
本章主题:何时以及如何创建对象,何时以及如何避免创建对象,如何确保它们能够实时的销毁,以及销毁之前必须进行的各种清理动作。
第1条:考虑用静态工厂方法代替构造器。
对于类而言,为了让客服端获得它的一个实例最常用的的一个方法就是提供一个公有的构造器。还有一种方法,类可以提供一个公有的静态工厂方法(static factory method),它只是一个返回类实例的静态方法。
例如:
public static Boolean valueof(boolean b){
return b? Boolean.TRUE:Boolean.FALSE;
}
通过静态工厂方法构造对象的优势:
1)静态工厂方法与构造器不同的第一大优势在于,它们有名称,使客服端代码更加容易被阅读。
2)不必在每次调用的它们的时候都创建一个新的对象(这个完全取决于具体的实现)。
3)它们可以返回原返回类型的任何子类型的对象。
这种灵活性的一种应用:API可以返回对象,同时又不会使对象的类变成公有的。公有的静态方法所返回的对象的类不仅可以是非公有的,而且该类还可以随着每次调用而发生变化着取决于静态工厂方法的参数值,只要是已声明返回类型的子类型,都是允许的。
4)在创建参数化类型(也就是泛型,jdk1.5新特性)实例的时候,它们是的代码变得更加简洁。
/**普通创建****/
Map<String,List<String>> m=new HashMap<String,List<String>>;
/**有了静态方法过后***/
Map<String,List<String>> m=HashMap.newInstance();
//前提HashMap提供了这个静态工厂方法
public static <k,v> HashMap<k,v> newInstance(){
return new HashMap<K,V>();
}
静态工厂方法的主要缺点在于:1)类如果不含有他的公有或者受保护的构造器,就不能被子类化(即被继承)。
2)它们与其他静态方法实际上没有任何区别。