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