Google Guava中Preconditions的用法,讓前置條件判斷變得更優雅
阿新 • • 發佈:2019-01-09
這幾天看Fresco和Glide的程式碼,發現他們都使用了Preconditions來做前置判斷條件,發現這樣寫,程式碼變得既優雅又容易除錯。
Preconditions的用法
OK,先看看平常寫程式碼我們是怎麼做的引數判斷。
判斷引數,如果引數配置錯誤,就丟擲異常
int[] intArray = {1, 2, 3, 4, 5, 6};
private void testPreconditions(boolean preCondition, int[] array, int position) {
if (!preCondition) {
throw new IllegalArgumentException("preCondition not allow!!");
}
if (array == null) {
throw new NullPointerException("array is null!!");
}
if (array.length == 0) {
throw new IllegalArgumentException("array length is 0!!");
}
if (position > array.length || position < 0 ) {
throw new ArrayIndexOutOfBoundsException("position error!!");
}
//do something...
}
這裡看起來,沒什麼,但是如果我這個類很大,方法很多呢?看到全篇都是if(XX==null) throw{...}
作何感想。
下面我們看看如果用Preconditions
做前置判斷
private void testPreconditions(boolean preCondition, int[] array, int position)
{
Preconditions.checkArgument(preCondition);
Preconditions.checkNotNull(array);
Preconditions.checkElementIndex(position, array.length, "position error!" );
//do something...
}
是不是清爽多了,使用Preconditions可以更清晰的表達程式意圖。
為什麼要使用Preconditions
那麼你可能會問,為啥要用Preconditions
,如果是空指標在用的時候,他自己就會丟擲異常啊。
但是我們期望的是儘早丟擲異常,而不是等到資料被層層傳遞,傳遞到非常深的位置,這樣浪費系統資源更不利於我們開發精確定位錯誤。
所以推薦在方法的入口,或運算開始前,先檢查資料。
例如:
int length = datas.get(5).getDescription().concat("XX").split(",").length;
像這種程式碼,就算丟擲空指標也不知道到底是那個物件空指標了,需要一步一步除錯
這就是Preconditions另一個作用:儘早發現錯誤,精確控制出錯的位置
抽取Preconditions
dependencies {
compile 'com.google.guava:guava:19.0'
}
guava的誕生旨在對Java Collection進行擴充套件以提高開發效率,但是隨著多年的發展它已經覆蓋到了Java開發的方方面面,在Java 8中,已經可以看到不少API就是從Guava中原封不動的借鑑而來。
例如,初始化一個集合,使用JDK這麼做
//JDK
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
但是使用Guava,可以很簡潔的表達
//Guava
List<String> list = Lists.newArrayList("a", "b", "c", "d");