返回零长度的数组或集合,而不是null
返回零长度的数组或集合,而不是null
像下面的方法并不少见:
private final List<Cheese> cheesesInStock = ...;
/**
* @return an array containing all of the cheeses in the shop,
* or null if no cheese are available for purchase.
*/
public Cheese[] getCheeses(){
if(cheesesInStock.size() == 0)
return null;
...
}
把没有奶酪(cheese)可买的情况当做一种特例,这是不合理的。这样做会要求客户端必须有额外的代码来处理null返回值,例如:
Cheese[] cheeses = shop.getCheeses();
if(chesses != null && Arrays.asList(cheeses).contains(Chees.STILTON))
System.out.println("Joll good, just the thing.");
而不是下面这些代码:
if(Arrays.asList(cheeses).contains(Chees.STILTON))
System.out.println("Joll good, just the thing.");
对于一个返回null而不是令狐冲那个度数组或者集合的方法,几乎每次都要用到该方法时都需要这种曲折的处理方式。这样做很容易出错,因为编写客户端程序的程序员可能会忘记这种专门的代码处理null的返回值。这样的错误也许几年都不会注意到,因为这样的方法通常返回一个或者多个对象。返回null而不是零长度的数组也会返回数组或者集合的方法本身变得更加复杂,这一点虽然不是特别重要,但是也值得注意。
有时候会有人认为:null返回值比零长度数组更好,因为它避免了分配数组所需要的开销。这种观点是站不住脚的,原因有两点。第一这个级别上担心性能问题是不明智的,除非分析表明这个方法正是造成性能问题的真正源头。第二,对于不返回任何元素的调用,每次都返回同一个零长度数组有可能的,因为零长度数组是不可变的,而不可变的对象有可能被自由的共享。实际上,当你使用标准化做法把一些元素从一个集合转存到一个类型化的数组中时,它正是这样做的:
// The rigth way to return an aray from a collection
private final List<Cheese> cheesesInStock = ...;
private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];
/**
* @return an array containing all of the cheeses in the shop,
* or null if no cheese are available for purchase.
*/
public Cheese[] getCheeses(){
return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);
}
在这种习惯用法中,零长度数组常量被传递给toArray方法,以指明所期望的返回类型。toArray方法分配了返回的数组,但是,如果集合是空,它将使用零长度的出入数组,Collection.toArray(T[])的规范保证:如果输入的数组大到足够容纳这个集合,它将返回这个输入数组。因此,这种做法永远也不会分配到零长度的数组。
同样的,集合值的方法也可以做成在每当需要返回同一个不可变的空集合。Collections.emptySet、emptyList和emptyMap方法提供的正是你需要的。
// The right way to return a cope of a collection
public List<Cheese> getCheeseList(){
if(cheeseInStock.isEmpt())
return Collections.emptyList();//Always return same list
else
return new ArrayList<Cheese>(cheesesInStock);
}
简而言之,返回类型为数组或者几何的方法没有理由返回null,而是返回一个零长度的数组或者集合。
返回零长度的数组或集合,而不是null的更多相关文章
- Effective Java 之-----返回零长度的数组或集合而不是null
如下代码,通常用户列表为空时,会习惯性返回null,因为这时会认为:null返回值比零长度数组更好,因为它避免了分配数组所需要的开销. private final List<UserBean&g ...
- Effective java 43返回零长度的数组或者集合而不是null
- 返回零长度的数组或者集合,而不是null
<<Effective Java>> 第四十三条:返回零长度的数组或者集合,而不是null 假设一个方法的返回值类型是集合或者数组 .假设在方法内部须要返回的集合或者数组是零长 ...
- 第四十三条:返回零长度的数组或者集合,而不是null
如果一个方法的返回值类型是集合或者数组 ,如果在方法内部需要返回的集合或者数组是零长度的,也就是没有实际对象在里面, 我们也应该放回一个零长度的数组或者集合,而不是返回null.如果返回了null,客 ...
- 第43条:返回零长度的数组或者集合,而不是null
private final List<Cheese> cheesesInStock = ...; public Cheese[] getCheese() { if(cheesesInSto ...
- GNU C 中零长度的数组【转】
原文链接:http://www.cnblogs.com/dolphin0520/p/3752492.html 在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNU C中,存在一个非常奇怪的用 ...
- 读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组
原文链接:C语言结构体里的成员数组和指针 复制例如以下: 单看这文章的标题,你可能会认为好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Lar ...
- C语言 结构体中的零长度数组
/* C语言零长度数组大小和取值问题 */ #include <stdio.h> #include <stdlib.h> #include <string.h> s ...
- 【Java】返回长度为零的数组或者集合,而不是null
今天在牛客网上做一个编程题时,在提交代码后老是抛出NullPointerException异常,大概的代码如下: public ArrayList<Integer> foo(TreeNod ...
随机推荐
- Performance Tuning Using Linux Process Management Commands
[root@bigdata-server-02 /]# ps --help all Usage: ps [options] Basic options: -A, -e all processes -a ...
- 大数据之环境准备系列 ——第二篇 新装VMware 虚拟机 网络配置(NAT模式)
新安装虚拟机,需要配置网络环境,才可以使用ssh客户端(如xshell)远程登录 和 虚拟机访问Internet. 一. WMware 软件配置 WMware版本号:11.0.0 build-2305 ...
- Machine Learning in Action(0) 开篇
现在貌似In Action很流行,各种技术抽象成工程商的Action,可以避开繁琐的内部原理,这本书从实践出发,通俗易懂的解释那些常用的机器学习算法,类似跟<集体智慧编程>.这本书中文出版 ...
- Redis之Ubuntu开机启动
1.编译源码,生成可执行文件: 2.将生成的可执行文件拷贝到 /user/local/bin目录下,若没有x权限请加上: 3.将安装包中的 redis.conf配置文件移到/etc/redis.con ...
- 异常描述:hibernate懒加载中,用OpenSessionInViewFilter解决之后,同时对一个collection创建两个session访问导致异常(Illegal attempt to associate a collection with two open sessions)
在保存的时候如果使用以下方法就会报错 解决:使用merge()方法就可以解决异常... merge()方法的解释: 传入的参数在数据库中不存在的时候会添加一条数据,根据主键判断已存在的时候会更新这条数 ...
- zkdash部署
1.拉取代码 #git clone https://github.com/ireaderlab/zkdash.git 2.安装依赖包 #cd zkdash #yum install -y python ...
- 编译Thrift
按照 https://syslint.com/blog/tutorial/how-to-install-apache-thrift-on-ubuntu-14-04/ 进行, 编译时出现错误 make[ ...
- 【CQ18高一暑假前挑战赛5】标程
[A:暴力] #include<bits/stdc++.h> using namespace std; ; int a[maxn],vis[maxn],N,M; int main() { ...
- testing
doctest_test.py def square(x): ''' 这里需要空格 >>> square(2) 4 啦啦 >>> square(3) 9 上不一行能 ...
- 如何使用 Jmeter 发送 Json 请求
公司最近有一个项目,需要持续发送大量的 Json 请求到服务器,从而测试服务器可靠性. 我就发送 Json 请求部分发布这个博客. 一般来说, Json 请求的数据都保存到 CSV 文件中,然后使用 ...