第43條:返回零長度的數組或者集合,而不是null

private final List<Cheese> cheesesInStock = ...;
public Cheese[] getCheeses(){
   if (cheesesInStock.size == 0)
       return null;
}

把沒有奶酪可買的情況當做一種特例,這是不合常理的。這樣做會要求客戶端必須有額外的代買來處理null的返回值。例如

Cheese[] cheeses  = shop.getCheeses();
if(cheeses != null && Arrays.asList(cheeses).contains(Cheese.STILTON)){
    System.out.println("Jolly good,just the thing.") ;
}

而不是下面這段代碼:

if( Arrays.asList(cheeses).contains(Cheese.STILTON)){
    System.out.println("Jolly good,just the thing.") ;
}

對于一個返回null而不是零長度數組或集合的方法,幾乎每次用到該方法時都需要這種曲折的處理方式。這樣做很容易出錯,因為編寫客戶端程序的程序員可能會忘記寫這種專門的代碼來處理null返回值。這樣的錯誤也許幾年都不會被注意到,因為這樣的方法通常返回一個或者多個對象。

image.png
image.png

有時候會有人認為:null返回值比零長度數組更好,因為它避免了分配數組所需要的開銷。
這個觀點站不住腳,首先這個級別擔心性能是不明智的,除非分析表明這個方法就是造成性能的根本原因;其次對于不返回任何元素的調用,每次都返回同一個零長度數組是可能的,因為零長度數組是不可變的,而不可變對象有可能被自由共享(15條:使可變性最小化).實際上,當使用標準做法把一些元素從一個集合轉存到一個類型化的數組中時,它正式這樣做的:

private final List<Cheese> cheeseInStock = …;
   private static final Cheese[] EMPTY_CHEESE_ARRAY =new Cheese[0];
   public Cheese[] getCheeses(){
       return cheeseInStock.toArray(EMPTY_CHEESE_ARRAY);  
 }

習慣用法中,零長度數組常量被傳遞給toArray方法,以指明所期望的返回類型.正常情況下,toArray方法分配了返回的數組,但是,如果集合是空的,它將使用零長度輸入數組.

集合值方法可以做成需要返回空集合時返回同一個不可變的空集合.Collections.emptySet(),
Collections.emptyList(),Collections.emptyMap()方法正是所需要的

 private final List<Cheese> cheeseInStock = …;
   public List<Cheese> getCheesesList(){
       if (cheeseInStock.isEmpty())
           rerurnCollections.emptyList();
       else
          return  new ArrayList(cheeseInStock);
  }

總結:返回類型為數組或集合的方法沒有理由返回null,而是返回一個零長度的數組或者集合.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容