effectiveJava

Effective Java Item54 - 返回零長度的數組或集合 而不是null

這篇是Effective Java - Return empty Arrays or Collections, not nulls章節的讀書筆記 本篇的程式碼來自於原書內容

Item54: 返回零長度的數組或集合 而不是null

蠻常有人用null來處理empty的case

//return an array of cheese, or null if no cheese are available
public Cheese[] getCheese() {
  if(cheesesInStock.size() == 0)
    return null;
}

乍看之下合理 但其實Client需要多做很多不必要的處理

你必須要寫成這樣

Cheese[] cheeses = shop.getCheese();
if(cheeses != null && 
  Arrays.asList(cheeses).contains(Cheese.STILTON))
  System.out.println("ya");

而不是這樣

Cheese[] cheeses = shop.getCheese();
if(Arrays.asList(cheeses).contains(Cheese.STILTON))
  System.out.println("ya");

幾乎每一次call你的函式 就必須要特別處理null的情況 這樣很容易出錯 因為很容易忘記要這麼處理

也許有人說這樣可以省點不必要的開銷 如果沒東西 我根本就不需要allocate一個空的數組 直接傳個所有人都看的懂的null搞定

但這個論點是站不著腳的 因為

1.在這種地方為了微小的performance而影響client使用的方法是不划算的

2.事實上 因為長度是零的數組可以被共享 Collection.emptySet, Collection.emptyList, Collection.emptyMap 這些函示可以給你不可變的空集合

//The right way to return a copy of a collection
public List<Cheese> getCheeseList() {
  if(cheesesInStock.isEmpty())
    return Collections.emptyList();
  else
    return new ArrayList<Cheese>(cheesesInStock);
}

總結

返回類型是數組或是集合的話 沒有理由返回null 這個習慣應該是從C傳過來的