0%

Guava中Preconditions的用法

Precondition是一系列的静态方法,帮助方法或者构造函数方便的检查变量是否合法。对于我们的日常开发中,需要大量的检验输入是否合法,在处理数据前进行validate check非常必要,否则会造成大量的意料不到的异常。而通过这种函数,就可以将这个异常变为可控。

  1. checkArgument(boolean expression)
  • 确保expression的真实性,false就抛出异常,一般配合isNotBlank使用
  • IllegalArgumentException()
  1. checkState(boolean expression)
  • 确保表达式的真实性,但不包含调用方法的任何参数。
  • IllegalStateException()
  1. checkNotNull(T reference)
  • 检查reference是否为空
  • NullPointerException()
  1. checkElementIndex(int index, int size)
  • 检查元素index是否在[0,size)的范围内,只需要传入大小
  • IndexOutOfBoundsException()
  1. checkPositionIndex(int index, int size)
  • 同上
  • IndexOutOfBoundsException()
  1. checkPositionIndexes(int start, int end, int size)
  • 检查[start,end)是否是长度为[0,size)的数组的子集,只需要传入大小
  • IndexOutOfBoundsException()

源码分析

我们选择checkArgument()作为源码分析的样本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//检查参数(expression)是否合法,若为false,抛出IllegalArgumentException异常
public static void checkArgument(boolean expression) {
if (!expression) {
throw new IllegalArgumentException();
}
}
//检查入参,带异常信息
public static void checkArgument(boolean expression, @Nullable Object errorMessage) {
if (!expression) {
throw new IllegalArgumentException(String.valueOf(errorMessage));
}
}
//检查入参,errorMessageTemplate表示异常信息模板,errorMessageArgs将被替换为信息模板中的参数
public static void checkArgument(boolean expression,
@Nullable String errorMessageTemplate,
@Nullable Object... errorMessageArgs) {
if (!expression) {
throw new IllegalArgumentException(format(errorMessageTemplate, errorMessageArgs));
}
}

这个源码简单易懂

代码尝试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Test {
@org.junit.Test
public static void main(String[] args) {
Boolean test = StringUtils.isNotBlank("");
try{
Preconditions.checkArgument(test);
}
catch (Exception e){
System.out.println(e);
}try{
Preconditions.checkArgument(test,"参数不可为空");
}
catch (Exception e){
System.out.println(e);
}
try{
Preconditions.checkArgument(test,"该参数为%s",test);
}
catch (Exception e){
System.out.println(e);
}
}
}

输出如下

1
2
3
java.lang.IllegalArgumentException
java.lang.IllegalArgumentException: 参数不可为空
java.lang.IllegalArgumentException: 该参数为false

Preconditions的优点就是很简单的在代码中正对判断抛出对应的异常,用%s的形式输出异常语句,简化了参数有效性校验的代码量。