考虑用静态工厂方法代替构造器

考虑用静态工厂方法代替构造器

概述

提供一个公有的静态工厂方法,返回类的一个实例

例子

1
2
3
public static Boolean valueOf(boolean b) {
return b ? Boolean.True : Boolean.False;
}

优势

  1. 拥有显式的名称;

用户可以清楚地知道自己需要那个构造函数构造的对象,例如BigInteger(int, int, Random)返回的是素数,但使用静态工厂方法BigInteger.probablePrime会更加明显。

  1. 不必每次调用的时候都创建一个新对象

静态工厂方法可以使用预先构建好的实例,或者将其缓存起来,重复利用。对象受控于静态工厂方法,可以确保它是一个单例。例如Boolean.valueOf这个方法从不创建新的实例。

  1. 可以返回原类型的任何子类型对象

这种灵活性带来的好处是,API可以返回对象,同时又不会使对象的类变成公有的,而且这个类还可以随着每次调用而发生变化。

  1. 在创建参数化类型实例的时候,代码将变得更加简洁

这里主要指的是类型推导。例如,原先的使用可能是:

1
Map<String, List<String>> map = new HashMap<String, List<String>>();

但假如我们有这样一个静态方法:

1
2
3
public static <K, V> HashMap<K, V> newInstance() {
return new HashMap<K, V>();
}

这样,我们就可以代替上述啰嗦的使用方式:

1
Map<String, List<String>> map = HashMap.newInstance();

缺点

  1. 类如果不含公有或者protected的构造函数,就不能被子类化。
  2. 与其他的静态方法没有任何区别。