1.作用
可以简洁的完成参数检验,在进行业务逻辑代码前进行前置判断。并且避免了冗长的if语句。guava将所有检验的API都放置于Preconditions类中。
2.api介绍
Preconditions类大致分为6种提供参数检验的方法,每种方法都有三个重载方法。重载方法的参数意义是:
仅有待校验的参数:抛出的异常中没有错误消息;
有一个Object对象作为额外参数:抛出的异常使用Object.toString() 作为错误消息;
*有一个String对象作为额外参数,还有一个Object[]参数,这两个参数也是适用于异常错误消息的,处理的方式类似于String.format将Object的参数按顺序替换掉String中的占位符(如%s)
(不包括额外参数)
方法声明(不包括额外参数) | 描述 | 检查失败时抛出的异常 |
---|---|---|
checkArgument(boolean) | 用来检查传递给方法的参数 | IllegalArgumentException |
checkNotNull(T) | 检查value是否为null,该方法直接返回value,因此可以内嵌使用checkNotNull | NullPointerException |
checkState(boolean) | 用来检查对象的某些状态 | IllegalStateException |
checkElementIndex(int index, int size) | 检查index作为索引值对某个列表、字符串或数组是否有效。index>=0 && inde | IndexOutOfBoundsException |
checkPositionIndex(int index, int size) | 检查index作为位置值对某个列表、字符串或数组是否有效。index>=0 | IndexOutOfBoundsException |
checkPositionIndexes(int start, int end, int size) | 检查[start, end]表示的位置范围对某个列表、字符串或数组是否有效* | IndexOutOfBoundsException |
3.实例
如:我们在做登录操作的方法中,在未用前置条件前,代码可能会如下:
public User login(String userName,String password){
if(StringUtils.isEmpty(userName) || StringUtils.isEmpty(password)){
throw new RuntimeException("用户名或密码不能为空");
}
User user = userService.queryUserByUserNameAndPassword(userName,password);
if(null == user){
throw new RuntimeException("用户名或密码错误");
}
//…………………………………………省略业务逻辑…………………………………………
}
当使用了Preconditions类后
public User login(String userName,String password){
Preconditions.checkArgument(!(StringUtils.isEmpty(userName) || StringUtils.isEmpty(password)),"用户名或密码不能为空");
User user = userService.queryUserByUserNameAndPassword(userName,password);
Preconditions.checkNotNull(user,"用户名或密码错误");
//…………………………………………省略业务逻辑…………………………………………
}
当参数增多怎么会办,要给客服端返回不同的msg和code
自定义一个自己的异常类
public class MyException extends RuntimeException{
private static final long serialVersionUID = 1L;
private String message;
private Integer code;
}
自己改造的utils类
public class PreconditionUtils {
/**
* 判断字符串不能为空,若字符串为空则报异常
*
* @param string
* 待校验字符串
* @param string
* 标识字符串
*/
public static void notEmpty(String string, int code ,String msg) {
try {
Preconditions.checkState(!StringUtils.isEmpty(string));
} catch (Exception e) {
throw new MyException (msg, code);
}
}
}
判断
@RequestMapping("/login")
public Map<String, Object> login(String userName,String password){
Map<String, Object> rootJson = new HashMap<String, Object>(3);
try {
PreconditionUtils.notEmpty(userName, "-1","没有填写用户名");
PreconditionUtils.notEmpty(password,"-2","没有输入密码");
} catch (PreconditionException e) {
rootJson.put("code", e.getCode());
rootJson.put("msg", e.getMsg());
//异常记录数据库
return rootJson;
}
}