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就好。
相关文章
相关标签/搜索