Java 返回零长度数组或集合,而不是返回null


下面的方法并不少见:


private final list 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的判断。


正确做法是返回零长度的数组或集合。


private final List cheesesInStock = ...;


private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];//零长度数组,不可变!

//返回数组

public Cheese[] getCheeses() {

return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);

}


//返回集合

public List getCheeseList() {

if(cheeseInStock.isEmpty() ) {

return Collections.emptyList();// 总是返回相同的列表

}

else {

return new ArrayList(cheeseInStock);

}

}



零长度数组的定义:


		int[] zeroArray = new int[0];
		System.out.println(zeroArray.length); // 0

因为零长度的数组不可变(总不可能这样做吧。zeroArray[0] = 8,数组长度为0,怎么可能会有zeroArray[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

你可能感兴趣的:(Java)