3

Supposing I have a function with following signature:

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

What is the recommended practice to return the value indicating there is no elements returned? Any pros or cons for each option?

4

5 回答 5

11

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

如果有某种错误,你应该抛出一个Exception.

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

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

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

于 2010-09-28T03:14:21.393 回答
0

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

缺点是您使代码更加冗长。

如果您确实返回一个空数组,则可以通过重用同一个对象来减轻性能损失。创建一个不可变常量,并返回:

private static final String[] EMPTY = {};

或者:

private static final List<String> EMPTY = 
    Collections.unmodifiableList(new ArrayList<String>());
于 2010-09-28T04:31:22.177 回答
0

我更喜欢零大小的数组

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

于 2010-09-28T05:13:57.727 回答
0

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

于 2010-09-28T03:24:19.663 回答
0

Effective Java (2nd ed) - item 43: return empty arrays or collections, not nulls

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

于 2010-09-28T14:10:31.333 回答