原始碼 | 靜態工廠返回宣告的返回型別的子型別的例項

monkeysayhi發表於2019-02-18

與構造方法相比,靜態工廠方法擁有三大優勢:

  1. 有名稱
  2. 不必在每次呼叫它們的時候都建立一個新的物件
  3. 可以返回宣告的返回型別的子型別的例項

優勢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 國際許可協議釋出,歡迎轉載,演繹或用於商業目的,但是必須保留本文的署名及連結。

相關文章