假设我有一个带有以下签名的函数:
Foo[] getSomeFoos()
{
//return null --- option A
or
//return new Foo[0]; --- option B
}
建议的做法是返回表示没有返回元素的值?每个选项的优缺点是什么?
答案 0 :(得分:11)
如果您的方法GetSomeFoos()
实际上'找到'0个元素,那么它应该返回new Foo[0]
。
如果出现某种错误,您应该抛出Exception
。
原因是因为用户不必查找空值:
for (Foo f: GetSomeFoos()) {
// do stuff
}
在上述情况下,如果GetSomeFoos
返回null
,则用户必须处理NullPointerException
。但是,如果返回一个空数组,代码将永远不会进入循环,用户将不必处理异常。
答案 1 :(得分:0)
是否完全返回null或空对象取决于方法用法。如果客户端调用此方法并将其作为API公开,那么抛出异常会更好,但如果它在ur包中使用并且从未被客户端使用,那么返回null就可以了。
答案 2 :(得分:0)
返回null更有效,因为您可以避免创建新数组或集合对象的开销。确实,您必须在使用函数输出的位置添加空检查,但是它的开销(使用Java和几乎所有语言)可以忽略不计。我还认为检查null是一个很好的习惯,尤其是在处理第三方库时。
缺点是你使代码更加冗长。
如果确实返回空数组,则可以通过重新使用同一对象来降低性能。创建一个不可变常量,并返回:
private static final String[] EMPTY = {};
或者:
private static final List<String> EMPTY =
Collections.unmodifiableList(new ArrayList<String>());
答案 3 :(得分:0)
我更喜欢零大小的数组。
它更安全(避免NPE)并且更容易(不需要空检查)。
答案 4 :(得分:0)
从Effective Java(第2版) - 第43项:返回空数组或集合,而不是空值
总之,没有理由从数组或集合值方法返回null而不是返回空数组或集合