1. 程式人生 > >Google Guava中Preconditions的用法,讓前置條件判斷變得更優雅

Google Guava中Preconditions的用法,讓前置條件判斷變得更優雅

這幾天看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");