第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);
}
时间: 2024-10-12 23:57:47

第43条:返回零长度的数组或者集合,而不是null的相关文章

Effective Java 之-----返回零长度的数组或集合而不是null

如下代码,通常用户列表为空时,会习惯性返回null,因为这时会认为:null返回值比零长度数组更好,因为它避免了分配数组所需要的开销. private final List<UserBean> UserList = null; public List<UserBean> getUserBean(){ if(UserList.size() == 0){ return null; }else{ return UserList; } } 但这种观点是站不住脚的,原因如下: 1) 在这个级

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

<<Effective Java>> 第四十三条:返回零长度的数组或者集合,而不是null 如果一个方法的返回值类型是集合或者数组 ,如果在方法内部需要返回的集合或者数组是零长度的,也就是没有实际对象在里面, 我们也应该放回一个零长度的数组或者集合,而不是返回null.如果返回了null,客户端程序员就要检测返回的是不是null,然后才能 进行下一步操作,否则就会引发NullPointException.但是如果是返回的的是空数组或者集合,就不会再后续的使用这个对象上,引发 空指针

返回零长度的数组或者集合,而不是null——Effective Java 读书笔记

/** * 返回零长度的数组或者集合,而不是null * * @author 刘向峰 * */ public class Shop { private List<Object> objectList; // 零长度数组常量被传递给toArray方法,以指明所期望的返回类型 private final static Object[] EMPTY_OBJECT_ARRAY = new Object[0]; public Shop(List<Object> objectList) { s

第七章:方法。ITEM43:返回零长度的数组或者集合,而不是null 。

1 private final List<String> l = ... ; 2 3 public String[] getString() { 4 if(l.size() == 0) 5 return null ; 6 } 7 8 String[] s = getString(); 9 //对于一个返回null而不是零长度数组或者集合的方法,每次都要判断!=null 10 if(s != null && Arrays.asList(s).contains("a&qu

43.C#--写一个长度为10的集合,要求里面随机存放10个数字0-9,要求里面所有数字不能重

static void Main(string[] args){//写一个长度为10的集合,要求里面随机存放10个数字(0-9)//要求里面所有数字不能重复ArrayList list = new ArrayList();Random r = new Random();for (int i = 0; i < 10; i++){int rNumber = r.Next(0, 10);//集合中没有这个随机数if (!list.Contains(rNumber)){list.Add(rNumber)

零长度的数组【转】

原文链接:http://www.cnblogs.com/dolphin0520/p/3752492.html 在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNU C中,存在一个非常奇怪的用法,那就是长度为0的数组,比如Array[0];很多人可能觉得不可思议,长度为0的数组是没有什么意义的,不过在这儿,它表示的完全是另外的一层意思,这个特性是不可移植的,所以,如果你致力于编写可移植,或者是稍稍需要跨平台的代码,这些Trick最好还是收起来的好. 在GNU的指南中,它是如此写道: st

【代码优化】返回0长度数组或者集合

改掉你从C语言继承过来的习惯,我们在java中没理由返回类型为数组或者集合返回null. private final List<Cheese> InStock =...; public Cheese[] getCheeses() { if( InStock.size() ==0){ return null; } } 这种是我们经常使用的 返回的模式,这就带来在应用Cheese数组的时候 都需要判断数组是否为null. Cheese[] cheeses= shop.getCheeses(); i

读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组

原文链接:C语言结构体里的成员数组和指针 复制如下: 单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接.微博截图如下.我觉得好多人对这段代码的理解还不够深入,所以写下了这篇文章. 为了方便你把代码copy过去编译和调试,我把代码列在下面: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h>

关于零长度数组

声明:本文主要转载了http://coolshell.cn/articles/11377.html文章中关于 "零长度数组的内容",在此对原作者表示感谢 1. 前言 首先,我们要知道,0长度的数组在ISO C和C++的规格说明书中是不允许的.这也就是为什么在VC++2012下编译你会得到一个警告:"arning C4200: 使用了非标准扩展 : 结构/联合中的零大小数组". 那么为什么gcc可以通过而连一个警告都没有?那是因为gcc 为了预先支持C99的这种玩法,