Google Guava 优雅的参数验证(Preconditions)

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/

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值