Effective Java 3e - Item 49: Check parameters for validity 檢查參數的有效性 筆記。
傳入方法(method)或建構式(constructor)的參數(parameters)在使用前應先檢查有效性/合法性,例如是否為null,索引是否超出操作範圍,數值是否在計算範圍,內容是否符合格式等。
重點:
- 在API文件詳細說明參數使用限制。
- 在方法區塊開頭檢查參數的有效性。
- 若參數無效丟出例外。
- 使用
@throw
說明丟出的例外。 - 使用Java 8的type annotation如
@Nullable
、@NonNull
說明參數限制。 - 使用Java 7
Objects.requireNonNull()
檢查null。 - 非公開方法使用斷言(assertion)確保參數的有效性。
下面為上述重點的程式範例:
/**
* Returns a BigInteger whose value is (this mod m). This method
* differs from the remainder method in that it always returns a
* non-negative BigInteger.
*
* @param m the modulus, which must be positive
* @return this mod m
* @throws ArithmeticException if m is less than or equal to 0 // 使用@throw說明丟出的例外
*/
public BigInteger mod(BigInteger m) {
if (m.signum() <= 0) // 在方法區塊開頭檢查參數的有效性
throw new ArithmeticException("Modulus <= 0: " + m); // 若參數無效丟出例外
... // Do the computation
}
// 使用Java 8的type annotation說明參數限制
public void doOther(@Nullable String name, @NonNull Integer age) {
...
}
public void doSomething(String name, Integer age) {
String name = Objects.requireNonNull(customerName, "name cannot be null"); // Java 7 Objects.requireNonNull()檢查null
int age = Objects.requireNonNull(age, "age cannot be null");
...
}
private static void sort(long a[], int offset, int length) {
assert a != null;
assert offset >= 0 && offset <= a.length; // 非公開方法使用斷言(assertion)確保參數的有效性
assert length >= 0 && length <= a.length - offset;
... // Do the computation
}
以上和防衛語句(Guard Clause)有點類似,但防衛語句不僅對檢查參數的有效性,還包含了對合法參數的某些邏輯預先排除讓程式可讀性提高。
沒有留言:
張貼留言