00.用静态工厂方法代替构造器
声明:此静态工厂方法非设计模式中的工厂方法模式
对于类而言,创建类的实例对象最常用的手段就是给类提供一个公有的构造器;还有一种手段是提供一个公有的静态工厂方法,它只是一个返回类
的实例的静态方法。
如,我们熟知的Boolean的代码示例
public class BooleanTest {
private Boolean bool;
// 公有构造方法
public BooleanTest(boolean bool) {
this.bool = bool;
}
// 静态工厂方法
public static Boolean valueOf(boolean bool){
return bool?Boolean.TRUE:Boolean.FALSE;
}
}
对比分析公有构造方法和静态工厂方法创建对象的优劣势
静态工厂方法优势:
- 静态工厂方法与构造器不同的第一大优势在于,静态工厂方法有名称,这样有益于客户端使用,产生的客户端的代码更易读。
- 静态工厂方法与构造器不同的第二大优势在于,静态工厂方法不必在每次调用它们的时候都创建一个对象。
- 静态工厂方法与构造器不同的第三大优势在于,静态工厂方法可以返回原返回类型的任何子类型的对象。
- 静态工厂方法与构造器不同的第四大优势在于,静态工厂方法所返回的对象的类可以随着每次调用而发生变化,这取决于静态工厂方法的参数值。
- 静态工厂方法与构造器不同的第五大优势在于,方法返回的对象的所属的类,在编写包含该静态工厂方法的类时可以不存在。
静态工厂方法劣势:
- 静态工厂方法与构造器不同的第五大劣势在于,类如果不含公有的或者受保护的构造器,就不能被子类化。
public class Parent {
private Parent(){}
public static Parent getP() {
return new Parent();
}
}
// There is no default constructor available in 'effective00.Parent'
public class Son extends Parent {
}
- 静态工厂方法与构造器不同的第五大劣势在于,程序员很难发现它们。
可使用from,of,valueOf,instance,getIntance,create,newInstance等方法名来命名。
总结
简而言之,静态工厂方法和公有构造器都有用处,我们需要理解它们各自的长处。静态工厂经常更加合适,因此切忌第一反应就是提供公有的构造器,
而不先考虑静态工厂。