侧边栏壁纸

使用 Guava 的 Preconditions 和 Apache Commons Lang3 的 StringUtils 进行参数校验

2024年10月10日 174阅读 0评论 2点赞

在软件开发中,参数校验是确保应用程序健壮性和可靠性的关键环节。合理的参数校验不仅可以防止潜在的错误,还能提供清晰的错误信息,便于调试和维护。本文将介绍如何结合使用 Google 的 Guava 库中的 Preconditions 类与 Apache Commons Lang3 的 StringUtils 类进行高效的参数校验。

Guava 的 Preconditions 概述

Guava 是 Google 开发的一个开源 Java 基础库,提供了许多实用的工具类和方法。其中,Preconditions 类专门用于参数校验,确保方法的输入参数满足预期条件。常用的方法包括:

  • checkNotNull(T reference, String errorMessage): 检查引用是否为 null
  • checkArgument(boolean expression, String errorMessage): 检查布尔表达式是否为 true
  • checkState(boolean expression, String errorMessage): 检查对象状态是否符合预期。

优点

  • 简洁性:减少了繁琐的 if 语句。
  • 一致性:提供统一的参数校验方式。
  • 明确的错误信息:通过自定义错误信息,便于调试。

Apache Commons Lang3 的 StringUtils 概述

Apache Commons Lang 是 Apache 提供的一个常用的 Java 工具库,StringUtils 类是其中的一个核心组件,提供了丰富的字符串处理方法。常用的方法包括:

  • isEmpty(String str): 检查字符串是否为空 (null"")。
  • isBlank(String str): 检查字符串是否为空 (null"" 或仅包含空白字符)。
  • isNotEmpty(String str): 检查字符串是否不为空。
  • isNotBlank(String str): 检查字符串是否不为空且不全为空白字符。

优点

  • 丰富的功能:提供了多种字符串处理方法,覆盖大多数常见需求。
  • 提高代码可读性:方法命名清晰,意图明确。
  • 减少重复代码:避免了开发者编写重复的字符串处理逻辑。

结合使用 Preconditions 和 StringUtils 进行参数校验

将 Guava 的 Preconditions 与 Apache Commons Lang3 的 StringUtils 结合使用,可以实现高效且简洁的参数校验。例如:

import com.google.common.base.Preconditions;
import org.apache.commons.lang3.StringUtils;

public class SubjectCategoryService {
    public void createCategory(SubjectCategoryDTO subjectCategoryDTO) {
        Preconditions.checkNotNull(subjectCategoryDTO.getCategoryType(), "分类类型不能为空");
        Preconditions.checkArgument(!StringUtils.isBlank(subjectCategoryDTO.getCategoryName()), "分类的名称不能为空");
        Preconditions.checkNotNull(subjectCategoryDTO.getParentId(), "分类的父级id不能为空");
        
        // 业务逻辑处理
    }
}

在上述代码中,Preconditions 用于检查对象是否为 null 或布尔表达式是否为 true,而 StringUtils.isBlank 用于判断字符串是否为空或仅包含空白字符。这种组合使用方式使得参数校验简洁明了,代码可读性和维护性显著提高。

代码示例解析

让我们详细解析上述代码示例中的各个部分。

1. 检查分类类型是否为空

Preconditions.checkNotNull(subjectCategoryDTO.getCategoryType(), "分类类型不能为空");
  • 功能:确保 categoryType 不为 null
  • 方法checkNotNull,如果 categoryTypenull,则抛出 NullPointerException,并附带错误信息 "分类类型不能为空"。
  • 优点:避免了后续业务逻辑中因 null 导致的潜在 NullPointerException

2. 检查分类名称是否为空或仅包含空白字符

Preconditions.checkArgument(!StringUtils.isBlank(subjectCategoryDTO.getCategoryName()), "分类的名称不能为空");
  • 功能:确保 categoryName 不为空,且不全为空白字符。
  • 方法

    • StringUtils.isBlank(subjectCategoryDTO.getCategoryName()):判断 categoryName 是否为 null"" 或仅包含空白字符。
    • checkArgument:如果表达式 !StringUtils.isBlank(...)false,则抛出 IllegalArgumentException,并附带错误信息 "分类的名称不能为空"。
  • 优点:确保分类名称有效,防止用户输入无效数据。

3. 检查分类的父级 ID 是否为空

Preconditions.checkNotNull(subjectCategoryDTO.getParentId(), "分类的父级id不能为空");
  • 功能:确保 parentId 不为 null
  • 方法:同上,使用 checkNotNull
  • 优点:确保分类有一个有效的父级 ID,维护分类层级关系。

最佳实践

在实际开发中,结合使用 PreconditionsStringUtils 进行参数校验时,以下最佳实践值得遵循:

1. 明确错误信息

提供清晰、简洁且具描述性的错误信息,便于快速定位问题。例如:

Preconditions.checkNotNull(user.getEmail(), "用户邮箱不能为空");

2. 避免过度校验

仅在必要的地方进行参数校验,避免冗余的检查。例如,如果某个参数在调用前已经被校验,可以考虑不再重复校验。

3. 使用适当的校验方法

根据具体需求选择合适的 Preconditions 方法:

  • 使用 checkNotNull 检查引用是否为 null
  • 使用 checkArgument 检查方法参数是否符合预期条件。
  • 使用 checkState 检查对象的内部状态。

参考资料

2
打赏

—— 评论区 ——

昵称
邮箱
网址
取消
人生倒计时
舔狗日记