天天看點

第1條:考慮用靜态工廠方法代替構造方法

靜态工廠方法的一個好處是,與構造方法不同,靜态工廠方法具有名字。

例如:

BigInteger要産生一個素數,那麼

public static BigInteger java.math.BigInteger.probablePrime(int bitLength, Random rnd)
           

比構造方法好,好在代碼的可讀性。

靜态工廠方法的第二個好處是,與構造方法不同,他們每次被調用的時候,不要求非得建立一個新的對象。

例如:

java.lang.Boolean的代碼裡:

public static final Boolean TRUE = new Boolean(true);

    public static final Boolean FALSE = new Boolean(false);

    public static Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
    }
           

靜态工廠方法的第三個好處是,與構造方法不同,它們可以傳回一個原傳回類型的子類型的對象。

例如:

Collections.singletonList提供了不可修改的list。
Collections.synchronizedList提供了同步後的list。
           

不可修改的list和同步的list,是通過靜态工廠方法導出來的。

Collections.singletonList傳回的是SingletonList,該類不是公有的,是List的實作類。
Collections.synchronizedList傳回的是SynchronizedList,該類也不是公有的,也是List的實作類。


           

靜态工廠方法的主要缺點是,類如果不含有公有的或者受保護的構造方法,就不能被子類化。

例如:

上面的SingletonList,SynchronizedList,是不能執行個體化的,因為它們是私有的内部類。也不能執行個體化Collections,因為它的構造方法是私有的。

靜态工廠方法的第二個缺點是,它們與其他的靜态方法沒有任何差別。

是以,有些靜态方法是工廠方法,有些則不是,不過,valueOf和getInstance這兩個方法名,一般是看做靜态工廠方法的。

繼續閱讀