1、前言
在我们的日常开发中,经常要对入参进行校验,比如是否为空、参数的取值范围是否符合要求等等。如果我们单独进行参数校验的话,代码的重复率比较高,也不是很优雅。Guava提供了PreConditions类来统一校验我们的参数,同时可以抛出对应的异常信息,将参数校验的工作进行了统一。
前置条件: 让方法调用的前置条件判断更简单。
2、PreConditions类中的几种校验方法
1、checkArgument(boolean)
- 描述:检查boolean是否为true,用来检查传递给方法的参数
- 检查失败时,抛出的异常:IllegalArgumentException
- 支持类似 printf 函数那样的格式化输出错误信息
- 举例
Preconditions.checkArgument(1 > 2, "Argument was %s but expected nonnegative", i);
- public static void checkArgument(
boolean expression
);- 举例
Preconditions.checkArgument(a>1) // 如果表达式为false, 抛出IllegalArgumentException
- public static void checkArgument(
boolean expression
,@Nullable Object errorMessage
);- 举例
Preconditions.checkArgument(1 > 2, ParameterErrorEnum.NOT_SMALLER_ZEOR.getMsg());
- public static void checkArgument(
boolean expression
,@Nullable String errorMessageTemplate
,@Nullable Object... errorMessageArgs
)
2、checkNotNull(T)
- 描述:检查value是否为null,该方法直接返回value,因此可以内嵌使用checkNotNull
- 检查失败时,抛出的异常:NullPointerException
3、checkState(boolean):
- 功能:功能和 checkState 十分类似,验证失败时,抛出的异常不同
- 描述:用来检查对象的某些状态
- 检查失败时,抛出的异常:IllegalStateException
4、checkElementIndex(int index, int size)
- 功能:用于判断指定数组, 列表, 字符串的下标是否越界
- 描述:检查index作为索引值对某个列表、字符串或数组是否有效。index>=0 && index<size
- 检查失败时,抛出的异常:IndexOutOfBoundsException
- 举例
int index = Preconditions.checkElementIndex("test".length(), "test".length());
- 运行结果:java.lang.IndexOutOfBoundsException: index (4) must be less than size (4)`
Assert.assertEquals(3, Preconditions.checkElementIndex("test".length() - 1, "test".length()));
- 运行结果:通过
5、checkPositionIndex(int index, int size):
- 描述:检查index作为位置值对某个列表、字符串或数组是否有效。index>=0 && index<=size
- 检查失败时,抛出的异常:IndexOutOfBoundsException
6、checkPositionIndexes(int start, int end, int size):
- 描述:[start, end] 是否在 [0, size] 范围内(如果 [start, end] 和 [0, size] 相同, 也认为在范围内), 如果不在, 则抛出 IndexOutOfBoundsException 异常
- 检查失败时,抛出的异常:IndexOutOfBoundsException
3、举个“栗子”
maven的pom文件中添加
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.0</version>
</dependency>
CheckParamUtils 参数校验工具类
public class CheckParamUtils {
public static void isNotNull(String field, String fieldDes) throws IllegalStateException {
Preconditions.checkState(!StringUtils.isBlank(field), fieldDes + ParameterErrorEnum.NOT_NULL.getMsg());
}
public static void isBiggerZero(Long field, String fieldDes) throws IllegalStateException {
Preconditions.checkState(field != null && field > 0, fieldDes + ParameterErrorEnum.NOT_SMALLER_ZEOR.getMsg());
}
public static void isBiggerZero(Integer field, String fieldDes) throws IllegalStateException {
Preconditions.checkState(field != null && field > 0, fieldDes + ParameterErrorEnum.NOT_SMALLER_ZEOR.getMsg());
}
}
校验参数
private ResultDTO<Boolean> checkParam(AuacPublishStrategyGroupRequest publishRequest) {
ResultDTO<Boolean> result = new ResultDTO();
try {
CheckParamUtils.isBiggerZero(publishRequest.getStrategyGroupId(), "id");
CheckParamUtils.isNotNull(createUpdateRequest.getName(), "策略组名称");
} catch (IllegalStateException e) {
return ResultUtil.newFailureResult(e.getMessage(), null);
} catch (Exception e) {
return ResultUtil.newFailureResult("入参检验异常", null);
}
return result;
}
ParameterErrorEnum
public enum ParameterErrorEnum {
NOT_NULL("不能为空"),
NOT_SMALLER_ZEOR("不能为空,且不能小于0");
String msg;
ParameterErrorEnum(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
运行结果
参考
https://www.jianshu.com/p/54dadd1a2693
http://blog.itpub.net/69904796/viewspace-2649674/