考虑用静态工厂方法代替构造器
概述
提供一个公有的静态工厂方法,返回类的一个实例
例子
1 | public static Boolean valueOf(boolean b) { |
优势
- 拥有显式的名称;
用户可以清楚地知道自己需要那个构造函数构造的对象,例如BigInteger(int, int, Random)返回的是素数,但使用静态工厂方法BigInteger.probablePrime会更加明显。
- 不必每次调用的时候都创建一个新对象
静态工厂方法可以使用预先构建好的实例,或者将其缓存起来,重复利用。对象受控于静态工厂方法,可以确保它是一个单例。例如Boolean.valueOf这个方法从不创建新的实例。
- 可以返回原类型的任何子类型对象
这种灵活性带来的好处是,API可以返回对象,同时又不会使对象的类变成公有的,而且这个类还可以随着每次调用而发生变化。
- 在创建参数化类型实例的时候,代码将变得更加简洁
这里主要指的是类型推导。例如,原先的使用可能是:
1 | Map<String, List<String>> map = new HashMap<String, List<String>>(); |
但假如我们有这样一个静态方法:
1 | public static <K, V> HashMap<K, V> newInstance() { |
这样,我们就可以代替上述啰嗦的使用方式:
1 | Map<String, List<String>> map = HashMap.newInstance(); |
缺点
- 类如果不含公有或者protected的构造函数,就不能被子类化。
- 与其他的静态方法没有任何区别。