• [Spring源码阅读]通过Assert校验参数


    Spring Assert

    在开发过程中,可能经常需要写下面的条件判断:

    1. if(XXX) {
    2. throw new BusinessException(ErrorCode.PARAM_ERROR, "参数校验失败");
    3. }

    Spring源码中发现了另一种相对更优雅的写法,通过Assert校验参数。

    该工具类位于包: org.springframework.util

    截取几个关键的方法:

    1. public static void state(boolean expression, String message) {
    2. if (!expression) {
    3. throw new IllegalStateException(message);
    4. }
    5. }
    6. public static void state(boolean expression, Supplier<String> messageSupplier) {
    7. if (!expression) {
    8. throw new IllegalStateException(nullSafeGet(messageSupplier));
    9. }
    10. }
    11. public static void isTrue(boolean expression, String message) {
    12. if (!expression) {
    13. throw new IllegalArgumentException(message);
    14. }
    15. }
    16. public static void isTrue(boolean expression, Supplier<String> messageSupplier) {
    17. if (!expression) {
    18. throw new IllegalArgumentException(nullSafeGet(messageSupplier));
    19. }
    20. }
    21. public static void isNull(@Nullable Object object, String message) {
    22. if (object != null) {
    23. throw new IllegalArgumentException(message);
    24. }
    25. }
    26. public static void isNull(@Nullable Object object, Supplier<String> messageSupplier) {
    27. if (object != null) {
    28. throw new IllegalArgumentException(nullSafeGet(messageSupplier));
    29. }
    30. }
    31. @Deprecated
    32. public static void isNull(@Nullable Object object) {
    33. isNull(object, "[Assertion failed] - the object argument must be null");
    34. }
    35. public static void notNull(@Nullable Object object, String message) {
    36. if (object == null) {
    37. throw new IllegalArgumentException(message);
    38. }
    39. }
    40. public static void notNull(@Nullable Object object, Supplier<String> messageSupplier) {
    41. if (object == null) {
    42. throw new IllegalArgumentException(nullSafeGet(messageSupplier));
    43. }
    44. }

    优点

    于是开头的if判断,可以通过下面的表达式进行参数校验

    Assert.isTrue(XX, XX);

     用一个表达式替换之前的 if 和 throw,更加优雅简洁。

    其实像三元表达式、JDK8的Optional,都是类似的思想,尽量用一个表达式替换 if else。

    为什么不用jdk自带的assert

    jdk自带的assert校验不通过会抛出一个Error,无法抛出具体业务相关的通用异常。所以即使assert不会给系统带来额外的开销,项目中使用的也不是很多。

    如果自定义一个Assert工具类,则可以根据项目需要抛出自定义的异常,更契合项目。

  • 相关阅读:
    CompletableFuture异步任务编排
    Java通用转换地图坐标系离线算法,天地图和超图WGS84坐标系、高德GCJ-02坐标系和百度BD-09坐标系三个坐标系互相转换
    【FreeSwitch开发实践】在nodejs中用ESL连接FreeSwitch
    php-java-net-python-北京名胜古迹展览网站计算机毕业设计程序
    Idea新建项目配置Java3D 环境配置
    MATLAB - excel 读取
    上周热点回顾(10.17-10.23)
    mpi4py基本介绍和实战-MPI实现区域分解算法
    AOP的动态代理机制
    Qt中QPropertyAnimation动画效果展示
  • 原文地址:https://blog.csdn.net/qq_37855749/article/details/126493709