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

空間開銷很小,如果這是值得做的事情,還有其他方法可以最小化它。