优雅校验数据-前置条件
前言
根据防御式编程的要求, 在日常的开发中, 总少不了对函数的各种入参做校验, 以便保证函数能按照预期的流程执行下去. 比如各种费率的值就没可能是负数, 如果费率出现负数, 所以数据有问题, 我们需要做的事情就是把这些有问题的数据挑出来. 自己手写这些校验函数未免过于繁琐, 所幸的是我们需要的函数已经有现成的:
Guava 提供了一系列的静态方法用于校验函数和类的构造器是否符合预期, 并称其为前置条件(preconditions). 如果前置条件校验失败, 就会抛出一个指定的异常.
前置函数特征
目前的前置校验方法有如下特征:
须需要, 下面例子中的checkArgument
函数可以替换成任何一个前置条件校验函数
- 这些前置方法一般接受一个布尔表达式作为入参,并判断表达是否为
true
, 格式如:
Preconditions.checkArgument(a>1)
// 如果表达式为false, 抛出IllegalArgumentException
- 除了用于判断的布尔表达式之外, 前置方法可以接受一个额外的
Object
作为入参, 在抛出异常的时候, 把Object.toString()
作为异常信息, 如:
public enum ErrorDetail {
SC_NOT_FOUND("404", "Resource could not be fount");
// 省略部分内容
@Override
public String toString() {
return "ErrorDetail{" + "code='" + code + '\'' + ", description='" + description + '\'' + '}';
}
}
@Test
public void testCheckArgument() {
Preconditions.checkArgument(1 > 2, ErrorDetail.SC_NOT_FOUND);
}
// 结果如下:
// java.lang.IllegalArgumentException: ErrorDetail{code='404', description='Resource could not be fount'}
- Guava的前置表达式还支持类似
printf
函数那样的格式化输出错误信息, 只不过出于兼容性和性能的考虑, 只支持使用%s
指示符格式化字符串, 不支持其他类型. 如:
int i=-1;
checkArgument(i >= 0, "Argument was %s but expected nonnegative", i);
// 结果如下:
// java.lang.IllegalArgumentException: Argument was -1 but expected nonnegative
前置条件函数介绍
须注意的是, 下面介绍的checkArgument
,&nb