让我们先举坏例子:
返回null的情况
private final List<Cheese> cheesesInStock = ...; public Cheese[] getCheeses() { if(cheesesInStock.size() == 0) return null; ... }
对于上面的例子,客户端程序处理时如下:
Cheese[] cheeses = shop.getCheeses(); if(Cheeses != null && Arrays.asList(cheeses).contains(Cheese.STILTON)) System.out.println("Jolly good, just the thing.");
我们可以看出,客户端程序员需要专门去判断Cheese是否为null,这让客户端代码写起来很费劲,客户端程序员也很容易忘记判断是否为null的情况。
因此,最好返回数组或者集合的个数,即使是0。
因为如果返回的是数组的个数,客户端代码就可以写得很简明,如下:
if(Arrays.asList(cheeses).contains(Cheese.STILTON)) System.out.println("Jolly good, just the thing.");
另外,集合值也可以做成每当需要返回空集合时,都返回同一个不可变的空集合。例如:Collections.emptySet、emptyList和emptyMap。
例子如下:
public List<Cheese> getCheeseList() { if(cheesesInStock.isEmpty()) return Collections.emptyList(); else return new ArrayList<Cheese>(cheesesInStock); }
这个观点来自<<Effective Java>>。
在Collections中有专门针对List,Set,Map的空的实现。如:
Collections.emptyList()
Collections.emptySet();
Collections.emptyMap();
在返回这些集合的方法中,尽量不要返回空值,避免NullPointerException。而就尽量返回非空值,这时候上面
所示的三个空(不是null)集合就有用武之地了,可以使用它们。
如在某方法中这样做:
publci List<String> getInterests(){
if(interests == null){
return Collections.emptyList();
}
return interests;
}
同理,针对需要返回数组的方法,也没必要返回空数组。可以用new int[0]之类的长度为0的数组的来替代。这样也可以避免返回空值。