Effective Java: Item 1

  • Consider static factory method instead of constructors
  • 考慮使用靜態(tài)工廠模式替代構(gòu)造函數(shù)

要點(diǎn)回顧

  1. 靜態(tài)工廠模式優(yōu)點(diǎn)
    1. 可指定具有特定含義的函數(shù)名
    2. 被調(diào)用時無需每次都new新的對象
    3. 可構(gòu)造子類對象
    4. 構(gòu)造對象對外封閉
    5. 構(gòu)建靜態(tài)工廠函數(shù)中可以不構(gòu)造返回的實(shí)例
  2. 靜態(tài)工廠模式缺點(diǎn)
    1. 只提供靜態(tài)工廠方法的類無法被繼承
    2. 靜態(tài)工廠方法不顯而易見

筆記細(xì)節(jié)

1.1 可指定具有特定含義的函數(shù)名

考慮到某個class會有多個構(gòu)造函數(shù)萧吠,他們帶有不同數(shù)量狞膘,不同類型的參數(shù)奈懒。在使用當(dāng)中犬钢,我們很容易混淆這些構(gòu)造函數(shù)及參數(shù)的含義赂毯。改為使用靜態(tài)工廠模式構(gòu)建實(shí)例,可通過恰當(dāng)?shù)暮瘮?shù)名來構(gòu)建易于區(qū)分的不同種實(shí)例。

例如:

public class Machine {
    private boolean on;
    private boolean charged;

    public Machine(boolean on, boolean charged) {
        this.on = on;
        this.charged = charged;
    }

    public Machine(boolean on) {
        this.on = on
        this.charged = false
    }

    public static Machine newChargedMachine(boolean on) {
        return new Machine(on, true);
    }

    public static Machine newUnchargedMachine(boolean on) {
        return new Machine(on);
    }
}

當(dāng)使用構(gòu)造函數(shù)構(gòu)建實(shí)例時

Machine m = new Machine(false, true);

很難辨認(rèn)出第一個與第二個參數(shù)的具體含義。
當(dāng)我們引入靜態(tài)工廠模式

Machine m = Machine.newChargedMachine(true);

很容易通過調(diào)用的方法名來區(qū)分出構(gòu)造的實(shí)例

1.2 被調(diào)用時無需每次都new新的對象

當(dāng)我們希望重復(fù)利用已構(gòu)建的實(shí)例庐镐,避免重復(fù)構(gòu)建實(shí)例時,我們可以使用singleton模式变逃。例如最簡單的singleton模式:

public class Singleton {
    public static final Singleton singleton = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return singleton;
    }
}

1.3 可構(gòu)造子類對象

通過靜態(tài)工廠模式在父類中構(gòu)造子類對象

public class Animal {
    public static Animal newDog() {
        return new Dog();
    }

    public static Animal newCat() {
        return new Cat();
    }
}
public class Dog extends Animal {}
public class Cat extends Animal {}

1.4 構(gòu)造對象對外封閉

靜態(tài)工廠模式可在對外封閉的情況構(gòu)建新的或者修改現(xiàn)有的子類對象必逆,使用者無需過多了解具體類及實(shí)現(xiàn)。java.util.Collections充分體現(xiàn)了這一點(diǎn)揽乱。當(dāng)我們需要構(gòu)造一個恒定為空的List時名眉,我們只需調(diào)用Collections內(nèi)的一個靜態(tài)方法而無需去了解EmptyList是怎樣的一個子類

List emptyList = Collections.emptyList()

1.5 構(gòu)建靜態(tài)工廠函數(shù)中可以不構(gòu)造返回的實(shí)例

在靜態(tài)工廠中,我們甚至可以只表明返回接口的函數(shù)凰棉,不構(gòu)造需要返回的實(shí)例损拢。而是在運(yùn)行時動態(tài)的載入實(shí)例并返回。

public static MyInterface getMyInterfaceInstance() {
    //load instance dynamically and return it.
}

參考stackoverflow:https://stackoverflow.com/questions/53240626/what-does-static-factories-returned-object-need-not-exist-mean

2.1 只提供靜態(tài)工廠方法的類無法被繼承

如果只提供靜態(tài)工廠方法構(gòu)造實(shí)例而沒有public或者protected的構(gòu)造函數(shù)撒犀,該類將無法被繼承福压。這是一個有爭議的缺點(diǎn)因?yàn)殡m然繼承可以復(fù)用大量代碼,使結(jié)構(gòu)更為清晰化或舞。冗雜與不恰當(dāng)?shù)睦^承有時反而會造成代碼的過度包裝與復(fù)雜化荆姆。

2.2 靜態(tài)工廠方法不顯而易見

在文檔中,靜態(tài)工廠方法沒有構(gòu)造函數(shù)那樣顯而易見映凳,它沒有固定的命名格式胆筒。有時,你需要仔細(xì)閱讀文檔才能發(fā)現(xiàn)某種靜態(tài)工廠方法诈豌。為了彌補(bǔ)這個缺點(diǎn)仆救,多使用一些慣用的命名規(guī)則:

  • from - 類型之間的轉(zhuǎn)化,往往只有一個參數(shù)
  • of - 用于構(gòu)造某種類型的組合矫渔,由多個相同類型參數(shù)組成
  • valueOf - from的另一種寫法
  • instance/getInstance - 返回一個實(shí)例彤蔽,若帶有參數(shù),參數(shù)常表明實(shí)例的某些特征選項(xiàng)
  • create/newInstance - 與 instance/getInstance 類似蚌斩,但保證new出一個新的實(shí)例
  • getType - 類似 instance/getInstance铆惑,但往往會構(gòu)造另一個類的實(shí)例范嘱,例如Files.getFileStore(path);
  • newType - 類似 create/newInstance,但往往會構(gòu)造另一個類的實(shí)例员魏,例如 BufferedReader br = Files.newBufferedReader(path);
  • type - 類似 getType 和 newType
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丑蛤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子撕阎,更是在濱河造成了極大的恐慌受裹,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虏束,死亡現(xiàn)場離奇詭異棉饶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)镇匀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門照藻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人汗侵,你說我怎么就攤上這事幸缕。” “怎么了晰韵?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵发乔,是天一觀的道長。 經(jīng)常有香客問我雪猪,道長栏尚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任只恨,我火速辦了婚禮译仗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坤次。我一直安慰自己古劲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布缰猴。 她就那樣靜靜地躺著产艾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滑绒。 梳的紋絲不亂的頭發(fā)上闷堡,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音疑故,去河邊找鬼杠览。 笑死,一個胖子當(dāng)著我的面吹牛纵势,可吹牛的內(nèi)容都是我干的踱阿。 我是一名探鬼主播管钳,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼软舌!你這毒婦竟也來了才漆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤佛点,失蹤者是張志新(化名)和其女友劉穎醇滥,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體超营,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸳玩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了演闭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片不跟。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖船响,靈堂內(nèi)的尸體忽然破棺而出躬拢,到底是詐尸還是另有隱情躲履,我是刑警寧澤见间,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站工猜,受9級特大地震影響米诉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜篷帅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一史侣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧魏身,春花似錦惊橱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至家制,卻和暖如春正林,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颤殴。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工觅廓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涵但。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓杈绸,卻偏偏與公主長得像帖蔓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瞳脓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容