与构造方法相比,静态工厂方法拥有三大优势:
- 有名称
- 不必在每次调用它们的时候都创建一个新的对象
- 可以返回声明的返回类型的子类型的实例
优势1、2显然。这里在Java8源码里找一个证明优势3的例子,备忘。
JDK版本:oracle java 1.8.0_102
可以返回声明的返回类型的子类型的实例
见Java8的Collections类:
1 2 3
| public static <T> Set<T> unmodifiableSet(Set<? extends T> s) { return new UnmodifiableSet<>(s); }
|
观察UnmodifiableSet类:
1 2 3 4 5 6 7 8 9 10 11
| * @serial include */ static class UnmodifiableSet<E> extends UnmodifiableCollection<E> implements Set<E>, Serializable { private static final long serialVersionUID = -9215047833775013803L; UnmodifiableSet(Set<? extends E> s) {super(s);} public boolean equals(Object o) {return o == this || c.equals(o);} public int hashCode() {return c.hashCode();} }
|
可知,UnmodifiableSet的包级私有的。
Collections.unmodifiableSet()就是一个静态工厂方法,它可以返回原返回类型的任何子类型的对象,这带来了两大好处:
- 接口开发者对外承诺的返回类型是Set,而实现中却可以使用Set接口的任意一个实现类,比如这里返回的实现类就是不可变类UnmodifiableSet
- 接口开发者只需要将Set设为公有的,UnmodifiableSet的可以是任意访问权限,比如这里是包级私有的
类似的例子还有UnmodifiableMap、CopiesList等,非常之多。