靜態工廠方法的一些慣用名稱?舉例?

monkeysayhi發表於2019-01-27

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

本文記錄靜態工廠方法的一些慣用名稱,開發中應遵循這些好的習慣。

valueOf

該方法返回的例項與它的引數具有相同的“值”。

如Integer.valueOf()方法:

    public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
    }
…
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }複製程式碼

Integer類預設快取low~high之間的常量(low=-127;high預設127,可配置,最高high-low+1不超過Integer.MAX_VALUE,即陣列的最大長度),通過靜態工廠方法valueOf(i),low<=i<=high時,我們每次獲得的都是快取好的常量。這是靜態工廠方法帶來的好處。

of

valueOf的一種簡潔寫法。

如LocalDate.of()方法。

getInstance

返回的例項是根據方法的引數來描述的,但是不能夠說與引數具有相同的值。一般用來表示獲取相同的例項,如單例模式,或根根引數獲取不同的單例等。

newInstance

類似於getInstance。不同的是,一般用來表示獲取新的例項,如Class#newInstance()方法等。

與Builder模式相比,Class#newInstance()的缺點

Class#newInstance()破壞了編譯時的檢查:

  1. newInstance方法總是企圖呼叫類的無參構造器。這個構造器甚至可能根本不存在,或者使用者無訪問許可權,但編譯期間你不會收到任何錯誤
  2. newInstance方法還會傳播由無參構造器丟擲的任何異常,即使newInstance缺乏相應的throws子句

getType

返回的型別是根據方法的引數來描述的,但是不能夠說與引數具有相同的值。就像是針對型別的getInstance,如Character.getType()方法。

newType

待定,我沒理解,也沒找到例項。


參考:

  • 《Effective Java》中文版第2版

本文連結:靜態工廠方法的一些慣用名稱?舉例?
作者:猴子007
出處:monkeysayhi.github.io
本文基於 知識共享署名-相同方式共享 4.0 國際許可協議釋出,歡迎轉載,演繹或用於商業目的,但是必須保留本文的署名及連結。

相關文章