陷阱 - 使用 null 表示空数组或集合
一些程序员认为通过使用 null
来表示空数组或集合来节省空间是个好主意。虽然你可以节省少量空间,但另一方面,它会使你的代码更复杂,更脆弱。比较这两个版本的方法来对数组求和:
第一个版本是你通常编写方法的方式:
/**
* Sum the values in an array of integers.
* @arg values the array to be summed
* @return the sum
**/
public int sum(int[] values) {
int sum = 0;
for (int value : values) {
sum += value;
}
return sum;
}
第二个版本是如果你习惯使用 null
来表示一个空数组,你需要如何编写方法。
/**
* Sum the values in an array of integers.
* @arg values the array to be summed, or null.
* @return the sum, or zero if the array is null.
**/
public int sum(int[] values) {
int sum = 0;
if (values != null) {
for (int value : values) {
sum += value;
}
}
return sum;
}
如你所见,代码有点复杂。这直接归因于决定以这种方式使用 null
。
现在考虑这个可能是 null
的数组是否在很多地方使用。在你使用它的每个地方,你需要考虑是否需要测试 null
。如果你错过了需要在那里进行的 null
测试,你就冒险了。因此,以这种方式使用 null
的策略会导致你的应用程序更加脆弱; 即更容易受到程序员错误的影响。
这里的教训是使用空数组和空列表,这就是你的意思。
int[] values = new int[0]; // always empty
List<Integer> list = new ArrayList(); // initially empty
List<Integer> list = Collections.emptyList(); // always empty
空间开销很小,如果这是值得做的事情,还有其他方法可以最小化它。