Java 返回零长度数组或集合,而不是返回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的判断。


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


private final List<Cheese> cheesesInStock = ...;


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

//返回数组

public Cheese[] getCheeses() {

return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);

}


//返回集合

public List<Cheese> getCheeseList() {

if(cheeseInStock.isEmpty() ) {

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

}

else {

return new ArrayList<Cheese>(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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值