Effective Java筆記

第二章 建立和銷燬對象java

第1條 考慮用靜態工廠方法代替構造器緩存

二者建立對象的形式,例如:
構造器是new Boolean();
靜態工廠方法是dom

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

在Boolean類中, 常量TRUE和 FALSE又以下:性能

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

靜態工廠方法的4個優點:
1.有名稱,即方法名。構造器的參數沒有確切地描述其返回的對象,適當名稱的靜態工廠方法更容易使用,也易於閱讀。例如:
BigInteger(int, int, Random)返回的值可能爲素數;用名爲 BigInteger.probablePrime(int, Random)來表示,更清楚。code

2.沒必要在每次調用它們的時候都建立一個新對象。例如: Boolean.valueOf(boolean)。
這個方法中的 TRUE和 FALSE是預先構建好的實例,並被緩存,能夠重複利用。
若是程序常常建立相同的對象,而且代價很高,則這項技術能夠提高性能。對象

3.能夠返回原返回類型的任何子類型的對象。這樣提供了的靈活性。例如:
API能夠返回對象,同時又不會使對象的類變成公有的。這樣,API會變得簡潔。
java.util.EnumSet類中的noneOf方法。代碼片斷:element

if (universe.length <= 64)
    return new RegularEnumSet<>(elementType, universe);
else
    return new JumboEnumSet<>(elementType, universe);

其中 RegularEnumSet和 JumboEnumSet都是 EnumSet的子類。文檔

4.在建立參數化類型實例的時候,使代碼變得簡潔。例如:List

Map<String, List<String>> map = new HashMap<String, List<String>>();

若是 HashMap提供這樣的的方法:map

pubic static <K, V> HashMap<K, V> newInstance() {
    return new HashMap<K, V>();
}

那麼,上面的代碼就能夠這樣:

Map<String, List<String>> map =  HashMap.newInstance();

靜態工廠方法的2個缺點:1.類若是不含公有的或者受保護的構造器,就不能被子類化。2.與其餘的靜態方法實際上沒有任何區別。在API文檔中,沒有像構造器那樣明確標識出來,所以,對於提供了靜態工廠方法而不是構造器的類來講,要查明如何實例化一個類,有點困難。

相關文章
相關標籤/搜索