使用空集合或“空白”操作而不是null的主要优点是,大多数情况下,此类对象仍然可以在代码中工作而无需进一步修改.从本质上来说,空值更容易出错.
请使用以下代码,例如:
String[] names = data.getNames();
if (names != null) {
for (String name : names) {
// Do stuff
}
}
需要检查空值,否则您将获得NPE.使用标准for循环不能解决问题.另一方面,如果你知道你将总是得到某种类型的数组,你的代码将正常工作,无需额外的检查.如果数组为空,则循环将不会运行.问题解决了.
对于实现某种形式的操作的代码也是如此.另一个例子:
Action myAction = data.getActionToRun();
if (myAction != null) {
myAction.run();
}
再一次,你需要一个空检查.如果保证操作存在,那么你总是可以调用action.run()而没有任何副作用,但空白操作不会做任何事情.就这么简单.
在许多情况下,如果修改方法返回的方式,则可以简单地丢弃空检查,从而导致更简单易懂的代码.在某些情况下,返回null是正确的选择(例如,从键和值的集合中获取对象),因为没有默认的“无动作”值.但是null表示根本没有值,并且它需要额外的处理作为接收器.使用空白,无动作,非空对象允许数据对象处理错误.这是很好的封装.这是很好的编程.它只是有效.™
最后,返回null肯定不是处理错误的好方法.如果您的代码出现问题,除非您作为程序员犯了编程错误,否则应该永远不会出错,请使用断言或异常.那些都是失败的.不要将null用作失败案例,将其用作简单的缺少值.