考虑用静态工厂方法代替构造器
阅读Effective java
静态工厂方法的简介
在创建一个类的时候,除了使用公有的构造器,还可以使用公有的静态工厂方法。
Boolean的valueOf方法就是这样的一个例子:
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
使用静态工厂方法的好处:
- 有名称
- 不必在每次调用的时候创建一个新对象
能够为重复的调用返回相同的对象,这样有助于类总能严格控制在某个时刻哪些实例应该存在。这种类被称为实例受控的类
实例受控的类可以确保它是一个单例类,或是一个不可变的类,或是一个不可实例化的。 - 返回原返回类型的任何子类型的对象
由于相当于多了一层包装,所以静态工厂方法可以让返回的内容是任何子类型的对象。
不仅如此,还可以根据参数来返回不同的内容,比如java.util.EnumSet中的静态工厂方法,这样的好处是易于在发行版本的变更过程中改变返回的内容,提高软件的可维护性和性能。
服务提供者框架:
静态工厂方法返回的对象所属的类,在编写包含该静态工厂方法所属的类时可以不必存在。
JDBC API和现在用的很多的分布式框架Dubbo也基于这样的一个框架原理。
服务提供者框架有三个重要的组件:
- 服务接口 ---- 生产者
- 提供者注册API ---- 注册中心
- 服务访问API ---- 消费者
- 在创建参数化类型实例时,使代码变得更加简洁
使用静态工厂方法的缺点:
- 类如果不含有公有的或者受保护的构造器,就不能被子类化
- 它们和其他的静态方法实际上没有任何区别