靜態(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í)的檢查:
- newInstance方法總是企圖調(diào)用類的無(wú)參構(gòu)造器。這個(gè)構(gòu)造器甚至可能根本不存在,或者用戶無(wú)訪問(wèn)權(quán)限,但編譯期間你不會(huì)收到任何錯(cuò)誤
- 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è)目的,但是必須保留本文的署名及鏈接。