下面的方法并不少见:
private final list
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的判断。
正确做法是返回零长度的数组或集合。
private final List
private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];//零长度数组,不可变!
//返回数组
public Cheese[] getCheeses() {
return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);
}
//返回集合
public List
if(cheeseInStock.isEmpty() ) {
return Collections.emptyList();// 总是返回相同的列表
}
else {
return new ArrayList
}
}
零长度数组的定义:
int[] zeroArray = new int[0];
System.out.println(zeroArray.length); // 0
所以零长度数组可以作为类的共有(或私有)静态final域(引用不可变)。
因此为了节约开销,可以设定一个private static final int EMPTY_ARRAY = new int[0];
在该类的方法中如果返回数组为0,则返回该数组。(不管返回多少个,它们都是指同一个零长度数组)
如果想返回一个零长度的集合,可以使用集合框架的一个工具类Collections(有s哦)的emptyList()方法或着直接使用共有静态final域EMPTY_LIST。
总之,方法最好不要返回类型为集合或者数组的null,而是返回零长度的数组或者集合。
[参考Effective Java Second Edition] - Item 43