網頁

2020/6/14

Effective Java 3e - Item 49: Check parameters for validity 筆記

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)有點類似,但防衛語句不僅對檢查參數的有效性,還包含了對合法參數的某些邏輯預先排除讓程式可讀性提高。


沒有留言:

張貼留言