陷阱 - 使用 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
空間開銷很小,如果這是值得做的事情,還有其他方法可以最小化它。