Precondition 的作用就像其名字说的那样用来检测代码的执行条件, 当前有很多的库有着类似的功能, 例如

  1. Apache common PredicateUtils 

  2. Spring framework Assert 

  3. Junit Assert 



我之所以选择Guava框架因为它对错误信息显示支持 printf-style, 例如

checkArgument(i >= 0, "Argument was %s but expected nonnegative", i);


每一种Precondition的核心(静态)方法都有三种形态

  1. 不用显示任何的错误信息

  2. 有一个object的额外参数,使用 Object.toString()来表示错误信息

  3. 使用 print-style String来表示错误的信息如上例


Precondition 的核心方法

1. checkArgument( boolean )  主要用来判断方法参数, 传入false,会报IllegalStateException


2. checkNotNull(T) 判断传入对象时候为NULL,如果是NULL报错


3. checkState (boolean) 实现和checkArgument一样, 但是主要用来检测对象的状态。 


4. checkElementIndex(int index, int size)  检测给定索引时候在,字符串,列表和数组内合法。 传入的Index 必须 >= 0 && <size


5. checkPositionIndex(int index, int size) 测给定索引时候在,字符串,列表和数组内合法。 传入的Index 必须 >= 0 && <=size, 注意这里和checkElementIndex 的区别, 不过个人感觉这个方法应该是 >0 && <=size 才合理。


6. checkPositionIndexes(int start, int end, int size) 测给定范围索引时候在,字符串,列表和数组内合法。 传入的Index 必须  start >= 0 && end >= start && end <= size 的时候才合法


很奇怪为什么没有checkElementIndexs 方法