與構造方法相比,靜態工廠方法擁有三大優勢:
- 有名稱
- 不必在每次呼叫它們的時候都建立一個新的物件
- 可以返回宣告的返回型別的子型別的例項
優勢1、2顯然。這裡在Java8原始碼裡找一個證明優勢3的例子,備忘。
可以返回宣告的返回型別的子型別的例項
見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
出處:monkeysayhi.github.io
本文基於 知識共享署名-相同方式共享 4.0 國際許可協議釋出,歡迎轉載,演繹或用於商業目的,但是必須保留本文的署名及連結。