陷阱 - 使用 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

空间开销很小,如果这是值得做的事情,还有其他方法可以最小化它。