這個item是要告訴你要回傳空collection或array,而不要回傳null;因為這會讓你client需要多處理null的情況,也多了需要被測試的路徑,而且也不會比較快。以書中的範例來說,針對collections回傳值的處理,會建議你使用以下方式:
public List<Cheese> getCheeses() { return new ArrayList<>(cheesesInStock); }
Note. 這裡我不清楚作者為何要使用ArrayList,如果要immutable應該要用Collections.unmodifiableList。
作者提到有些反對這種做法的人,是基於產生empty collection的開銷,所以又提供了另外一種方式:
作者提到有些反對這種做法的人,是基於產生empty collection的開銷,所以又提供了另外一種方式:
public List<Cheese> getCheeses() { return cheesesInStock.isEmpty() ? Collections.emptyList() : new ArrayList<>(cheesesInStock); }
透過Collections.emptyList取得的empty collection,是可以減少產生的開銷,但也代表你要多寫單元測試代碼;作者認為如果沒有證據表明這真的是一個效能問題,就請忽略它,以避免增加不必要的困擾。
針對Array的情況也是類似:
public Cheese[] getCheeses() { return cheesesInStock.toArray(new Cheese[0]); }
假如在意new Cheese[0]會造成效能問題,就用空間換時間吧! 另外作者有提到,千萬別寫以下方式,會因而產生效能問題:
return cheesesInStock.toArray(new Cheese[cheesesInStock.size()]);
Note. 可以參考此篇詳細說明。
Reference:
- Effective Java, 3/e, Item 54。
留言
張貼留言