第43条:返回零长度的数组或者集合,而不是null
private final List<Cheese> cheesesInStock = ...;
public Cheese[] getCheese() {
if(cheesesInStock.size() == 0)
return null;
...
}
如果返回null,
在客户端处理代码就需要有额外的代码来处理null返回值:
Cheese[] cheeses = shop.getCheeses();
if(cheeses != null && Arrays.asList(cheese).contains(Cheese.STILTON))
System.out.println("Jolly good");
}
而不是:
Cheese[] cheeses = shop.getCheeses();
if( Arrays.asList(cheese).contains(Cheese.STILTON))
System.out.println("Jolly good");
}
认为null返回值比零长度数组更好,因为避免了分配数组所需要的开销,是不对的。
1.除非分析表明这是方法的确影响了性能
2.对于不返回任何类型调用,返回同一个零长度数组是可能的
Collections类提供当需要空集合时都返回同一个不可变的空集合的方法:
public List<Cheese> getCheeseList() {
if(cheeseInstock.isEmpty)) {
return Collections.emptyList();
else
return new ArrayList<Cheese>(cheesesInStock);
}
第43条:返回零长度的数组或者集合,而不是null的更多相关文章
- Effective Java 之-----返回零长度的数组或集合而不是null
如下代码,通常用户列表为空时,会习惯性返回null,因为这时会认为:null返回值比零长度数组更好,因为它避免了分配数组所需要的开销. private final List<UserBean&g ...
- Effective java 43返回零长度的数组或者集合而不是null
- 返回零长度的数组或者集合,而不是null
<<Effective Java>> 第四十三条:返回零长度的数组或者集合,而不是null 假设一个方法的返回值类型是集合或者数组 .假设在方法内部须要返回的集合或者数组是零长 ...
- 返回零长度的数组或集合,而不是null
返回零长度的数组或集合,而不是null 像下面的方法并不少见: private final List<Cheese> cheesesInStock = ...; /** * @retu ...
- 第四十三条:返回零长度的数组或者集合,而不是null
如果一个方法的返回值类型是集合或者数组 ,如果在方法内部需要返回的集合或者数组是零长度的,也就是没有实际对象在里面, 我们也应该放回一个零长度的数组或者集合,而不是返回null.如果返回了null,客 ...
- GNU C 中零长度的数组【转】
原文链接:http://www.cnblogs.com/dolphin0520/p/3752492.html 在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNU C中,存在一个非常奇怪的用 ...
- C语言 结构体中的零长度数组
/* C语言零长度数组大小和取值问题 */ #include <stdio.h> #include <stdlib.h> #include <string.h> s ...
- 读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组
原文链接:C语言结构体里的成员数组和指针 复制例如以下: 单看这文章的标题,你可能会认为好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Lar ...
- 【Java】返回长度为零的数组或者集合,而不是null
今天在牛客网上做一个编程题时,在提交代码后老是抛出NullPointerException异常,大概的代码如下: public ArrayList<Integer> foo(TreeNod ...
随机推荐
- Fox-H 函数
1.定义 2.特例 3.在分数阶微分方程中的应用 4.如何画图
- CocoaPods使用命令
5.需要在工程中创建一个Podfile文件, 使用命令: $cd /Users/shiyunlei/Desktop/CocoapodsSample(进入工程目录,cd后面的是工程的路径) $ touc ...
- 理解 traits
1.为什么使用traits? 考虑下面的需求,实现一个方法Advance(iter,n),接收一个迭代器iter和移动距离n,将iter向前移动n个距离. 分析,因为存在不同类型的迭代器,做同一件事情 ...
- iOS蓝牙中的进制转换
Bluetooth4.0.jpg 最近在忙一个蓝牙项目,在处理蓝牙数据的时候,经常遇到进制之间的转换,蓝牙处理的是16进制(NSData),而我们习惯的计数方式是10进制,为了节省空间,蓝牙也会把16 ...
- iOS开发——面试笔试精华(二)
面试笔试精华(二) 警告:一定要把英文题目过一遍,有些公司的题目故意弄成英文的!!! 1. Difference between shallow copy and deep copy? ...
- (转)如何在JavaScript与ActiveX之间传递数据2
本文研究如何在JS等脚本语言与ActiveX控件之间通信,如何传递各种类型的参数,以及COM的IDispatch接口.使用类似的方法,可以推广到其他所有脚本型语言,如LUA,AutoCad等.本文将研 ...
- C++如何用system命令获取文件夹下所有文件名
http://www.cplusplus.com/reference/cstdlib/system/ http://bbs.csdn.net/topics/30068943 #include < ...
- 封装的分页jq
(function ($) { $.fn.page = function (options) { var defaults = { divid: "pagediv", count: ...
- mysql datetime、date、time、timestamp区别
我们看看这几个数据库中(mysql.oracle和sqlserver)如何表示时间 mysql数据库:它们分别是 date.datetime.time.timestamp和year.date :“yy ...
- VirtualBox中centos网络配置
VirtualBox图形界面下有四种网络接入方式,它们分别是: 1.NAT 网络地址转换模式(NAT,Network Address Translation) 2.Bridged Adapter 桥接 ...