鍍金池/ 教程/ Java/ 前置條件
不可變集合
排序: Guava 強(qiáng)大的”流暢風(fēng)格比較器”
強(qiáng)大的集合工具類:java.util.Collections 中未包含的集合工具
新集合類型
常見 Object 方法
I/O
前置條件
字符串處理:分割,連接,填充
散列
原生類型
數(shù)學(xué)運(yùn)算
使用和避免 null
Throwables:簡(jiǎn)化異常和錯(cuò)誤的傳播與檢查
google Guava 包的 ListenableFuture 解析
事件總線
緩存
函數(shù)式編程
區(qū)間
集合擴(kuò)展工具類
Google-Guava Concurrent 包里的 Service 框架淺析
google Guava 包的 reflection 解析

前置條件

前置條件:讓方法調(diào)用的前置條件判斷更簡(jiǎn)單。

Guava 在 Preconditions 類中提供了若干前置條件判斷的實(shí)用方法,我們強(qiáng)烈建議在 Eclipse 中靜態(tài)導(dǎo)入這些方法。每個(gè)方法都有三個(gè)變種:

  • 沒有額外參數(shù):拋出的異常中沒有錯(cuò)誤消息;
  • 有一個(gè) Object 對(duì)象作為額外參數(shù):拋出的異常使用 Object.toString() 作為錯(cuò)誤消息;
  • 有一個(gè) String 對(duì)象作為額外參數(shù),并且有一組任意數(shù)量的附加 Object 對(duì)象:這個(gè)變種處理異常消息的方式有點(diǎn)類似 printf,但考慮 GWT 的兼容性和效率,只支持%s 指示符。例如:

    checkArgument(i >= 0, "Argument was %s but expected nonnegative", i);
    checkArgument(i < j, "Expected i < j, but %s > %s", i, j);
方法聲明(不包括額外參數(shù)) 描述 檢查失敗時(shí)拋出的異常
checkArgument(boolean) 檢查 boolean 是否為 true,用來(lái)檢查傳遞給方法的參數(shù)。 IllegalArgumentException
checkNotNull(T) 檢查 value 是否為 null,該方法直接返回 value,因此可以內(nèi)嵌使用 checkNotNull。 NullPointerException
checkState(boolean) 用來(lái)檢查對(duì)象的某些狀態(tài)。 IllegalStateException
checkElementIndex(int index, int size) 檢查 index 作為索引值對(duì)某個(gè)列表、字符串或數(shù)組是否有效。index>=0 && index<size * IndexOutOfBoundsException
checkPositionIndex(int index, int size) 檢查 index 作為位置值對(duì)某個(gè)列表、字符串或數(shù)組是否有效。index>=0 && index<=size * IndexOutOfBoundsException
checkPositionIndexes(int start, int end, int size) 檢查[start, end]表示的位置范圍對(duì)某個(gè)列表、字符串或數(shù)組是否有效* IndexOutOfBoundsException

譯者注:

索引值常用來(lái)查找列表、字符串或數(shù)組中的元素,如 List.get(int), String.charAt(int)

位置值和位置范圍常用來(lái)截取列表、字符串或數(shù)組,如 List.subList(int,int), String.substring(int)

相比 Apache Commons 提供的類似方法,我們把 Guava 中的 Preconditions 作為首選。Piotr Jagielski 在他的博客中簡(jiǎn)要地列舉了一些理由:

  • 在靜態(tài)導(dǎo)入后,Guava 方法非常清楚明晰。checkNotNull 清楚地描述做了什么,會(huì)拋出什么異常;
  • checkNotNull 直接返回檢查的參數(shù),讓你可以在構(gòu)造函數(shù)中保持字段的單行賦值風(fēng)格:this.field = checkNotNull(field)
  • 簡(jiǎn)單的、參數(shù)可變的 printf 風(fēng)格異常信息。鑒于這個(gè)優(yōu)點(diǎn),在 JDK7 已經(jīng)引入 Objects.requireNonNull 的情況下,我們?nèi)匀唤ㄗh你使用 checkNotNull。

在編碼時(shí),如果某個(gè)值有多重的前置條件,我們建議你把它們放到不同的行,這樣有助于在調(diào)試時(shí)定位。此外,把每個(gè)前置條件放到不同的行,也可以幫助你編寫清晰和有用的錯(cuò)誤消息。