靜態(tài)工廠方法的一些慣用名稱?舉例?

靜態(tài)工廠的優(yōu)勢(shì)見源碼|靜態(tài)工廠返回聲明的返回類型的子類型的實(shí)例。

本文記錄靜態(tài)工廠方法的一些慣用名稱,開發(fā)中應(yīng)遵循這些好的習(xí)慣。

valueOf

該方法返回的實(shí)例與它的參數(shù)具有相同的“值”。

如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類默認(rèn)緩存low~high之間的常量(low=-127;high默認(rèn)127,可配置,最高h(yuǎn)igh-low+1不超過(guò)Integer.MAX_VALUE,即數(shù)組的最大長(zhǎng)度),通過(guò)靜態(tài)工廠方法valueOf(i),low<=i<=high時(shí),我們每次獲得的都是緩存好的常量。這是靜態(tài)工廠方法帶來(lái)的好處。

of

valueOf的一種簡(jiǎn)潔寫法。

如LocalDate.of()方法。

getInstance

返回的實(shí)例是根據(jù)方法的參數(shù)來(lái)描述的,但是不能夠說(shuō)與參數(shù)具有相同的值。一般用來(lái)表示獲取相同的實(shí)例,如單例模式,或根根參數(shù)獲取不同的單例等。

newInstance

類似于getInstance。不同的是,一般用來(lái)表示獲取新的實(shí)例,如Class#newInstance()方法等。

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

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

  1. newInstance方法總是企圖調(diào)用類的無(wú)參構(gòu)造器。這個(gè)構(gòu)造器甚至可能根本不存在,或者用戶無(wú)訪問(wèn)權(quán)限,但編譯期間你不會(huì)收到任何錯(cuò)誤
  2. newInstance方法還會(huì)傳播由無(wú)參構(gòu)造器拋出的任何異常,即使newInstance缺乏相應(yīng)的throws子句

getType

返回的類型是根據(jù)方法的參數(shù)來(lái)描述的,但是不能夠說(shuō)與參數(shù)具有相同的值。就像是針對(duì)類型的getInstance,如Character.getType()方法。

newType

待定,我沒理解,也沒找到實(shí)例。


參考:

  • 《Effective Java》中文版第2版

本文鏈接:靜態(tài)工廠方法的一些慣用名稱?舉例?
作者:猴子007
出處:https://monkeysayhi.github.io
本文基于 知識(shí)共享署名-相同方式共享 4.0 國(guó)際許可協(xié)議發(fā)布,歡迎轉(zhuǎn)載,演繹或用于商業(yè)目的,但是必須保留本文的署名及鏈接。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容