Guava使用之Preconditions

Guava的Preconditions內置了很多前置條件判斷方法,這些判斷方法經常放在方法的最前面,用來檢查入參的條件是否符合,它可以使代碼變得更整潔。

每個方法都有三個變種:
1. 沒有額外的參數,拋出的異常中沒有錯誤信息
2. 有一個object對象作爲額外參數,拋出的異常中以object.toString()作爲錯誤信息
3. 有一個String作爲額外參數,附加不定數量的object對象,類似於printf,string中有佔位符,object分別指定佔位符的內容,不過只支持%s

方法聲明(不包括額外參數) 描述 檢查拋出的異常
checkArgument(boolean) 檢查boolean是否爲true,用來檢查傳遞給方法的參數。 IllegalArgumentException
checkNotNull(T) 檢查value是否爲null,該方法直接返回value,因此可以內嵌使用checkNotNull。 NullPointerException
checkState(boolean) 用來檢查對象的某些狀態。 IllegalStateException
checkElementIndex(int index,int size) 檢查index作爲索引值對某個列表、字符串或數組是否有效。index>=0 && index<size * IndexOutOfBoundsException
checkPositionIndex(int index,int size) 檢查index作爲位置值對某個列表、字符串或數組是否有效。index>=0 && index<=size * IndexOutOfBoundsException
checkPositionIndexs(int start,int end,int size) 檢查[start, end]表示的位置範圍對某個列表、字符串或數組是否有效* IndexOutOfBoundsException

對於最後三個方法:

  • 索引值常用來查找列表、字符串或數組中的元素,如List.get(int), String.charAt(int)
  • 位置值和位置範圍常用來截取列表、字符串或數組,如List.subList(int,int), String.substring(int)

在編碼的時候,如果一個參數有多個前置條件,應該把他們放在不同行,這樣有利於調試和設置錯誤信息

下面以checkArgument()爲例:
沒有額外的錯誤信息

public static void checkArgument(boolean expression) {
  if (!expression) {
    throw new IllegalArgumentException();
  }
}

有一個額外的錯誤信息對象object,錯誤信息是其toString()

public static void checkArgument(boolean expression, @Nullable Object errorMessage) {
  if (!expression) {
    throw new IllegalArgumentException(String.valueOf(errorMessage));
  }
}

有一個額外的String和不定數量的object(這個可以任意,只要是集成object的對象都可以,類型不限,數量不限)

public static void checkArgument(
    boolean expression,
    @Nullable String errorMessageTemplate,
    @Nullable Object... errorMessageArgs) {
  if (!expression) {
    throw new IllegalArgumentException(format(errorMessageTemplate, errorMessageArgs));
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章