使用空集合或“空白”动作而不是null的主要优点是大多数情况下,这些对象仍然可以在代码中工作,无需进一步修改。由于其本质,其核心价值观更容易出错。
看看下面的代码,例如:
String[] names = data.getNames();
if (names != null) {
for (String name : names) {
// Do stuff
}
}
为null
的检查是必需的,否则你会得到一个NPE。使用循环标准不能解决问题。另一方面,如果你知道你总是会得到一些类型的数组,你的代码将会在的罚款工作,没有额外的检查。如果数组为空,循环将不会运行。问题解决了。
对于实现某种形式的操作的代码也是如此。又如:
Action myAction = data.getActionToRun();
if (myAction != null) {
myAction.run();
}
再次,你需要一个null
检查。如果行动保证存在,那么你总是可以拨打action.run()
而没有任何副作用,但空白的行动是不会做任何事情。就这么简单。
在许多情况下,如果修改方法返回的方式,导致更简单易懂的代码,则可以简单地丢弃null
检查。在某些情况下,返回null
是正确的选择(例如,从键和值的集合中获取对象),因为没有默认的“无动作”值。但是null
表示根本没有价值,并且它需要额外的处理作为接收者。使用空白的无操作的非空对象允许数据对象处理错误。这是很好的封装。这是很好的编程。它只是工作。™
最后,返回null
当然不是处理错误的好方法。如果代码中出现错误,应该不会出现出错,除非您作为程序员犯了编程错误,请使用assert
或异常。那些是失败的。不要使用null
作为失败案例,将其用作简单的缺乏值。
我反对完全避免的东西,除非它被证明是完全不好用。在这种情况下,如果空的数组/列表和空值表示不同的含义,则应该使用空值。如果null和空数组/列表本身并没有传达特殊含义,那么它们可以互换使用,以使代码更清晰。 – nhahtdh 2012-07-20 05:10:59
我不明白你的第一点。什么是“真正的”阵列?如果你返回null,那*应该是真实的数组。如果这是一个错误的情况下,抛出一个异常。 – 2012-07-20 05:18:56
@JakeKing,你看我的例子吗?我有压缩函数,如果那个函数返回空数组,比解压缩函数会失败,因为它的实现,这需要检查它的第一个字节,所以我需要检查这种情况。 – 2012-07-20 05:23:01