1. 程式人生 > >[Google Guava] 1.2-前置條件

[Google Guava] 1.2-前置條件

原文連結 譯文連結 譯者: 沈義揚

前置條件:讓方法呼叫的前置條件判斷更簡單。

  • 沒有額外引數:丟擲的異常中沒有錯誤訊息;
  • 有一個Object物件作為額外引數:丟擲的異常使用Object.toString() 作為錯誤訊息;
  • 有一個String物件作為額外引數,並且有一組任意數量的附加Object物件:這個變種處理異常訊息的方式有點類似printf,但考慮GWT的相容性和效率,只支援%s指示符。例如:
checkArgument(i >= 0, "Argument was %s but expected nonnegative", i);
checkArgument(i < j, "Expected i < j, but %s > %s", i, j);
方法宣告(不包括額外引數) 描述 檢查失敗時丟擲的異常
檢查boolean是否為true,用來檢查傳遞給方法的引數。 IllegalArgumentException
檢查value是否為null,該方法直接返回value,因此可以內嵌使用checkNotNull NullPointerException
用來檢查物件的某些狀態。 IllegalStateException
檢查index作為索引值對某個列表、字串或陣列是否有效。index>=0 && index<size * IndexOutOfBoundsException
檢查index作為位置值對某個列表、字串或陣列是否有效。index>=0 && index<=size * IndexOutOfBoundsException

譯者注:

*索引值常用來查詢列表、字串或陣列中的元素,如List.get(int), String.charAt(int)

*位置值和位置範圍常用來擷取列表、字串或陣列,如List.subList(int,int), String.substring(int)

相比Apache Commons提供的類似方法,我們把Guava中的Preconditions作為首選。Piotr Jagielski在他的部落格中簡要地列舉了一些理由:

  • 在靜態匯入後,Guava方法非常清楚明晰。checkNotNull清楚地描述做了什麼,會丟擲什麼異常;
  • checkNotNull直接返回檢查的引數,讓你可以在建構函式中保持欄位的單行賦值風格:this.field = checkNotNull(field)
  • 簡單的、引數可變的printf風格異常資訊。鑑於這個優點,在JDK7已經引入Objects.requireNonNull的情況下,我們仍然建議你使用checkNotNull。

在編碼時,如果某個值有多重的前置條件,我們建議你把它們放到不同的行,這樣有助於在除錯時定位。此外,把每個前置條件放到不同的行,也可以幫助你編寫清晰和有用的錯誤訊息。