Java 使用array==null或array.length==0不返回任何内容?

Java 使用array==null或array.length==0不返回任何内容?,java,null,empty-list,Java,Null,Empty List,假设我有一个具有以下签名的函数: Foo[] getSomeFoos() { //return null --- option A or //return new Foo[0]; --- option B } 返回表示没有返回元素的值的建议做法是什么?每个选项的优缺点是什么?如果您的方法GetSomeFoos()实际“找到”了0个元素,那么它应该返回new Foo[0] 如果出现某种错误,您应该抛出一个异常 原因是用户不必查找空值:

假设我有一个具有以下签名的函数:

Foo[] getSomeFoos() 
{
      //return null         --- option A 
      or 
      //return new Foo[0];  --- option B
}

返回表示没有返回元素的值的建议做法是什么?每个选项的优缺点是什么?

如果您的方法
GetSomeFoos()
实际“找到”了0个元素,那么它应该返回
new Foo[0]

如果出现某种错误,您应该抛出一个
异常

原因是用户不必查找空值:

for (Foo f: GetSomeFoos()) {
    // do stuff
}

在上述情况下,如果
GetSomeFoos
返回
null
,则用户必须处理
NullPointerException
。但是,如果返回空数组,代码将永远不会进入循环,用户也不必处理异常。

返回null还是空对象完全取决于方法的使用。如果此方法由客户端调用并作为API公开,则抛出异常会更好,但如果它在ur包中使用且客户端从未使用过,则返回null是可以的。

返回null更有效,因为可以避免创建新数组或集合对象的开销。确实,您必须在使用函数输出的地方添加一个空检查,但是这方面的开销(在Java和几乎所有语言中)可以忽略不计。我还认为检查null是一个好习惯,尤其是在处理第三方库时

缺点是使代码更加冗长

如果返回空数组,则可以通过重新使用同一对象来降低性能损失。创建一个不可变常量,并返回:

private static final String[] EMPTY = {};
或:

私有静态最终列表为空=
Collections.unmodifiableList(新的ArrayList());

我更喜欢零大小数组

它更安全(避免NPE)和更容易(无需空检查)。

来自(第二版)-第43项:返回空数组或集合,而不是空值


总之,没有理由从数组或集合值方法返回null,而不是返回空数组或集合

返回null可能是合理的。我会用它来表示没有可能被退回的食物。在所有其他情况下,返回空数组是最明智的。@Joshua,我想我可以想出一个可以返回null的原因。但通常我会返回空列表/数组。返回null还是空对象完全取决于方法的使用。如果此方法由客户端调用并作为API公开,则引发异常会更好,但如果它在ur包中使用且客户端从未使用过,则返回null是可以的。请参阅[返回null是否是错误的设计?]()您正在争论:
返回null
返回新对象[0]
?我不敢相信分配0空间比不分配任何空间花费的时间要长得多。(等等,有什么区别吗?)过早的优化是万恶之源。不要返回null,当然不是因为这个原因。这有很大的区别。Java数组是一个对象,它不像C,数组只是指向堆上已分配块的指针。您需要为数组对象分配空间,并对其进行初始化,即使它有零个元素。通过escape分析,可以为固定大小的数组分配堆栈,这或多或少是不可操作的。如果您希望引用大量转义(并且可以证明分配有问题),您可以在静态final字段中存储零元素数组,并在每次找到零命中时返回相同的对象。
private static final List<String> EMPTY = 
    Collections.unmodifiableList(new ArrayList<String>());