Guava源碼分析——Preconditions

Preconditions做爲Guava中異常的前置檢查,提供了一系列方法。從源碼的實現中能夠看出,全部的方法都知足如下形式(除format()方法之外)。express

if (!status) {
    throw new xxException();
}

例如:app

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

源碼實現比較簡單,沒有太多須要細說。其中有個方法,format()方法,不一樣於String.format(),源碼實現以下:測試

static String format(String template, @Nullable Object... args) {
        template = String.valueOf(template); // null -> "null"

        // start substituting the arguments into the '%s' placeholders
        StringBuilder builder = new StringBuilder(template.length() + 16 * args.length);
        int templateStart = 0;
        int i = 0;
        while (i < args.length) {
            int placeholderStart = template.indexOf("%s", templateStart);
            if (placeholderStart == -1) {
                break;
            }
            builder.append(template.substring(templateStart, placeholderStart));// 獲取%s以前的字符串進行拼接
            builder.append(args[i++]);//替換%s
            templateStart = placeholderStart + 2;
        }
        builder.append(template.substring(templateStart));//拼接以後的字符串

     // 若是還有爲使用的args。直接在[]內顯示出來
// if we run out of placeholders, append the extra args in square braces if (i < args.length) { builder.append(" ["); builder.append(args[i++]); while (i < args.length) { builder.append(", "); builder.append(args[i++]); } builder.append(']'); } return builder.toString();

 與Preconditions相似的功能類,Verify提供了相似的方法,JDK原生的Assert也提供了相似的方法,使用方式遵循一下原則ui

  1. Precondis用於API實現者檢查API參數的合法性,語義爲"你弄的一團糟(API調用者)"
  2. Verify通常用於API實現者,在實現本身API的時候,調用其餘API時,驗證其返回的結果是否被指望,語義爲"一些我依賴的東西弄糟了一切"
  3. Assert通常用於Junit中,斷言測試是否成功

《Effective Java》中58條對CheckedException、RuntimeException和Error使用方式作了詳細的說明:google

  1. CheckedException用於開發人員,在catch到Exception後,能夠嘗試解決的場景。
  2. RuntimeException用於表明程序邏輯異常,可是此異常不可恢復,可根據程序邏輯,自定義(繼承RuntimeException)。
  3. Error與RuntimeException的應用場景差很少,可是不要嘗試去繼承Error,會使得程序語義混亂,使用JDK原生Error就好。
相關文章
相關標籤/搜索