Guava源码分析——Preconditions

Preconditions作为Guava中异常的前置检查,提供了一系列方法。从源码的实现中可以看出,所有的方法都满足以下形式(除format()方法以外)。

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

例如:

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也提供了类似的方法,使用方式遵循一下原则

  1. Precondis用于API实现者检查API参数的合法性,语义为"你弄的一团糟(API调用者)"
  2. Verify一般用于API实现者,在实现自己API的时候,调用其他API时,验证其返回的结果是否被期望,语义为"一些我依赖的东西弄糟了一切"
  3. Assert一般用于Junit中,断言测试是否成功

《Effective Java》中58条对CheckedException、RuntimeException和Error使用方式做了详细的说明:

  1. CheckedException用于开发人员,在catch到Exception后,可以尝试解决的场景。
  2. RuntimeException用于代表程序逻辑异常,但是此异常不可恢复,可根据程序逻辑,自定义(继承RuntimeException)。
  3. Error与RuntimeException的应用场景差不多,但是不要尝试去继承Error,会使得程序语义混乱,使用JDK原生Error就好。
时间: 2024-08-12 14:20:31

Guava源码分析——Preconditions的相关文章

Guava 源码分析之Cache的实现原理

Guava 源码分析之Cache的实现原理 前言 Google 出的 Guava 是 Java 核心增强的库,应用非常广泛. 我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的. 缓存 本次主要讨论缓存.缓存在日常开发中举足轻重,如果你的应用对某类数据有着较高的读取频次,并且改动较小时那就非常适合利用缓存来提高性能. 缓存之所以可以提高性能是因为它的读取效率很高,就像是 CPU 的 L1.L2.L3 缓存一样,级别越高相应的读取速度也会越快. 但也

Guava源码分析——Immutable Collections(1)

在Java中,conrrent包提供了很多线程安全的集合,但有的时候我们可以换一种方式对思考使用线程安全集合,Guava的Immutable提供了一系列不可变集合类型,不可变就使得集合成为了常量,常量必然线程安全.对于集合的不可变,除了Guava提供的Immutable Collections以外,还是有Collections.unmodifiableCollection(),而两者之间,还是有些区别的.从UML图中,可以看出,ImmutableCollection继承了AbstractColl

Guava源码分析——Optional

Google的Guava库的出现,使Java代码的书写更加流畅,无论是从效率还是代码风格上,Guava都必将成为一种趋势(Java8明显可以看出,大多数的功能开始借鉴Guava),今天开始,PoNa就以自己微薄的水平试着分析一下Guava的源码,借此使自己更上一层楼,还请各位多多扔砖. Guava文档中,第一篇就提到的尽量避免使用Null,会给代码带来一些负面影响,并举出map.get(key) == null,带来的混淆.由此.Guava提出了Optional的概念. 如图所示,Guava的O

Guava源码分析——Immutable Collections(2)

分析过Immutable Collections后,进入具体的数据结构来分析,这一次我们来看看ImmutableList.作为线性可重复集合,ImmutableList的底层实现采用了数组,因为不可变集合,就不存插入删除的操作.数组的下标使得根据index的read的操作,时间复杂度变为了O(1).对于ImmutableList的两种实现,我们先来看下UML图. 首先,我们看下构造一个ImmutableList的方法 @Test public void constructImmutableLis

Guava源码分析——Multi Collections(1)

Immutable集合作为Guava提供的集合类型,并没有脱离集合的接口,例如ImmutableList依然实现List接口.但接下来几章要分析的Multi Collections则几乎脱离了JAVA原本所带的集合(这也是为什么Multixxx,代表集合数据结构的单词为小写),作为了JAVA集合的一个补充. 对于Map<T,Integer>这样的Map结构,会经常被使用到,而我们统计T出现的次数的时候,大多时候进行的操作遍历统计,代码如下所示: Map<String, Integer&g

Guava源码分析——Immutable Collections(3)

这一次,我们来分析ImmutableSet,与ImmutableList大同小异,建议大家先看完上一篇Immutable Collections(2),在继续往下看 相同: ImmutableSet底层也采用数组实现 of().copyOf()方法实现逻辑也相同 元素也是按传入顺序排列的 实现是根据元素个数,分为EmptyImmutableSet.SingletonImmutableSet.RegularImmutableSet 不同: construct()方法的实现不再是简单的copy,需要

Guava源码分析——Immutable Collections(4)

Immutable的集合体系,还有中很重要的集合没有介绍,就是ImmutableMap,通过UML图,可以看出ImmutableMap的结构体系. 首先来看一下ImmutableBiMap,因为普通ImmutableMap的实现依赖于它.ImmutableBiMap在ImmutableMap的基础上,加入inverse()等方法,可以使键值反转.ImmutableBiMap的构造,也是根据元素个数的不同,使用不同的实现(0-->EmptyImmutablBiMap,1-->SingletonI

Guava源码分析——Ordering

毋庸置疑,Ordering肯定实现了Comparator<T>接口,这是Java中比较排序使用的.而其中的静态方法返回一种类型的Ordering,不同的Ordering子类实现各自的compare()方法,如下所示: public static <C extends Comparable> Ordering<C> natural() { return (Ordering<C>) NaturalOrdering.INSTANCE; } 实现类有如下: 如果Or

Hadoop之HDFS原理及文件上传下载源码分析(上)

HDFS原理 首先说明下,hadoop的各种搭建方式不再介绍,相信各位玩hadoop的同学随便都能搭出来. 楼主的环境: 操作系统:Ubuntu 15.10 hadoop版本:2.7.3 HA:否(随便搭了个伪分布式) 文件上传 下图描述了Client向HDFS上传一个200M大小的日志文件的大致过程: 首先,Client发起文件上传请求,即通过RPC与NameNode建立通讯. NameNode与各DataNode使用心跳机制来获取DataNode信息.NameNode收到Client请求后,