與構造方法相比,靜態(tài)工廠方法擁有三大優(yōu)勢:
- 有名稱
- 不必在每次調用它們的時候都創(chuàng)建一個新的對象
- 可以返回聲明的返回類型的子類型的實例
優(yōu)勢1、2顯然。這里在Java8源碼里找一個證明優(yōu)勢3的例子,備忘。
JDK版本:oracle java 1.8.0_102
可以返回聲明的返回類型的子類型的實例
見Java8的Collections類:
public static <T> Set<T> unmodifiableSet(Set<? extends T> s) {
return new UnmodifiableSet<>(s);
}
觀察UnmodifiableSet類:
/**
* @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()就是一個靜態(tài)工廠方法,它可以返回原返回類型的任何子類型的對象,這帶來了兩大好處:
- 接口開發(fā)者對外承諾的返回類型是Set,而實現(xiàn)中卻可以使用Set接口的任意一個實現(xiàn)類,比如這里返回的實現(xiàn)類就是不可變類UnmodifiableSet
- 接口開發(fā)者只需要將Set設為公有的,UnmodifiableSet的可以是任意訪問權限,比如這里是包級私有的
類似的例子還有UnmodifiableMap、CopiesList等,非常之多。
本文鏈接:源碼|靜態(tài)工廠返回聲明的返回類型的子類型的實例
作者:猴子007
出處:https://monkeysayhi.github.io
本文基于 知識共享署名-相同方式共享 4.0 國際許可協(xié)議發(fā)布,歡迎轉載,演繹或用于商業(yè)目的,但是必須保留本文的署名及鏈接。