我已阅读此主题:Avoiding != null statements但我看不到任何好处。
如果返回空数组,则需要检查“真实”数组的位置以及空数组的位置。
您必须使用getName() != null
,而不是使用getName().length > 0
之类的代码。作为一个例子,我正在研究项目,我需要用少量的归档器来压缩一些数据,并决定选择尺寸最小的压缩数据。如果我从归档器“compress”方法返回null,我需要检查返回的值是否为null。如果我决定返回一个空数组,那么我还需要检查它是否为空。
我是对的吗?
答案 0 :(得分:11)
使用空集合或“空白”操作而不是null的主要优点是,大多数情况下,此类对象仍然可以在代码中工作而无需进一步修改。 null
值的核心因其性质而更容易出错。
请使用以下代码,例如:
String[] names = data.getNames();
if (names != null) {
for (String name : names) {
// Do stuff
}
}
需要检查null
,否则您将获得NPE。使用标准for循环不能解决问题。另一方面,如果你知道你将总是获得某种类型的数组,那么你的代码将 fine ,而无需额外的检查。如果数组为空,则循环将不会运行。问题解决了。
对于实现某种形式的操作的代码也是如此。另一个例子:
Action myAction = data.getActionToRun();
if (myAction != null) {
myAction.run();
}
再一次,您需要null
检查。如果确保操作存在,那么您始终可以在没有副作用的情况下调用action.run()
,但空白操作不会执行任何操作。就这么简单。
在许多情况下,如果修改方法的返回方式,则可以简单地丢弃null
个检查,从而产生更简单易懂的代码。在某些情况下,返回null
是正确的选项(例如,从一组键和值中获取对象),因为没有默认的“无动作”值。但是null
表示根本没有值,并且需要额外的处理才能成为接收者。使用空白,无动作,非空对象允许数据对象处理错误。这是很好的封装。这是很好的编程。它只是有效。™
最后,返回null
肯定不是处理错误的好方法。如果您的代码出现问题从不出错,除非您作为程序员犯了编程错误,请使用assert
或异常。那些都是失败的。不要将null
用作失败案例,将其用作简单的缺少值。
答案 1 :(得分:7)
空数组有时会返回更自然的对象。考虑一下这样的代码:
String [] elements = getElements();
for (String element : elements)
System.out.println(element);
如果返回一个空数组(即没有元素),则不打印任何内容,代码将正确执行。但是,如果getElements()返回null,您将获得空指针异常。为了防止它,你需要添加更多的代码,这使事情变得更加复杂。返回一个空数组可以在没有附加代码的情况下实现所需的行为。
答案 2 :(得分:1)
我有一段时间的想法。 暂时搁置NPE问题。我会尝试从OOP的角度解释我的想法。
假设您编写了一个为Glass实例提供getter的类
public Glass getGlass()
。
当我读到这个签名时,我期待一些Glass接口的实例,而null则不是一个。
您可以考虑下一个方法public Optional<Glass> getGlass()
。
Optional类(可以编写自己的类或使用Google's guava Optional)包含您的泛型类实例,同时提供 isPresent 函数。
这可能看起来多余,因为您可以从客户端代码中使用getGlass() != null
而不是getGlass().isPresent()
。但这里的主要优点是签名很简单。没有人隐藏任何东西,你不必猜测。
所以你得到了以下好处: