Guava 前提条件 checkNull、checkArgument

2023-12-14

我想检查基类的先决条件,以便我知道子类型将始终使用有效的构造函数参数。

让我们以一个构造函数为例:

  1. 需要 2 个或更多参数
  2. 接受不同类型的参数
  3. 对于一个参数,它执行多次检查(例如 String 不为 nulland不是空的)

在这种情况下,如何最好地使用 Guava 前提条件方法?

在这样的模拟示例中:(这是人为的!)

protected AbstractException(String errorMessage, Throwable errorCause) {
  super(errorMessage, errorCause);
  checkNotNull(errorMessage,
      ErrorMessage.MethodArgument.CANNOT_BE_NULL_CHECK, "errorMessage");
  checkArgument(!errorMessage.isEmpty(),
      ErrorMessage.MethodArgument.CANNOT_BE_EMPTY_STRING_CHECK,
      "errorMessage");
  checkNotNull(errorCause, ErrorMessage.MethodArgument.CANNOT_BE_NULL_CHECK,
      "errorCause");
}

我最终打电话super在检查参数之前,因为调用super需要是该方法的第一行,尽管我可以这样做super(checkNoNull(errorMessage)),我不能使用相同的包装checkArgument因为那会返回void。所以困境是:

  • 我在哪里对所有参数进行检查?我不想为此创建一个构建器
  • 如何像虚构的那样对支票进行“分组”checkStringNotNullAndNotEmpty()
  • 我应该考虑与匹配器框架集成吗? (hamcrest,节断言......)

我使用看起来很奇怪的 Error Message.Method Argument.CANNOT _BE_NULL_CHECK 因为默认值throw不包含错误消息,因此从测试方面我无法将其识别为参数验证失败而不是“任何”NPE?

我这一切都做错了吗?


这应该是一个评论,但它太长了。

  • Calling super在测试之前是无害的,前提是超级 ctor 不做以下事情无论如何都不应该这样做.
  • 可以通过静态构建器方法来防止它,您不需要构建器。但这不值得。
  • 我怀疑分组测试是一般来说有用;如果是的话,那么早就有这样的方法了。但如果你需要这样一个具体的东西超过两次,那就写你自己的;如果经常出现,请以 RFE 的形式向 Guava 团队报告。
  • 我很确定,匹配器在这里是一种矫枉过正,因为您只是创建一个例外,即很少使用的东西(我希望)。由于您的测试仅是运行时,因此实在帮不上忙捕获错误。如果您能够静态地确保“正确”构造异常,那就太好了,但在纯 java 中这是不可能的。

更重要的是:您抛出的异常可能不如没有所有检查时得到的异常。想象一下用户提供了一个原因但没有任何消息。你认为这很糟糕,但你却用没有任何理由的 NPE 替换了它。那就更糟了。

看看番石榴的Preconditions.format(包私有)。他们可以先检查参数的数量是否正确,但他们没有。你可以提供太少或太多,这是一个错误,但忽略它是处理它的最好方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Guava 前提条件 checkNull、checkArgument 的相关文章

随机推荐

  • Django AND .htaccess 重写/重定向,这可能吗?

    是否可以让 Apache htaccess 重写在到达 django 之前生效 我希望能够指定RewriteRules在优先于 django 的 htaccess 文件中 如果没有匹配的内容 则将其分派到 mod wsgi django 我
  • C 中 const 和 volatile 限定符的用法区别?

    我已经回答了问题 C 中 const 指针和 volatile 指针有什么区别 我理解的解释是 const 修饰符意味着此代码不能更改变量的值 但这并不意味着不能通过此代码之外的方式更改该值 然而 易失性表示 此数据可能会被其他人更改 因此
  • 重新启动游戏并重新实例化对象

    介绍 我正在用 C 创建一个小游戏 并想创建一个重新启动游戏的函数 首先我创建对象player 然后我有一个 if 语句来确定何时按下某个键来调用New 方法 My goal 在该方法中 我想重新实例化 Player 类的对象 因此所有变量
  • 将连接字符串中的排序规则属性设置为 SQL Server 2005

    我有一个 ASP Net Web 应用程序 其 web config 中包含 SQL Server 2005 的连接字符串 Data Source ABCSERVER Network Library DBMSSOCN Initial Cat
  • 找不到 Python Visual Studio 代码模块

    已安装 Python 3 7 6 并尝试在 Visual Studio Code 中编写代码 Using import pikepdf 让我犯以下错误ModuleNotFoundError No module named pikepdf 但
  • 如何使 pygame 窗口全屏显示而不隐藏任务栏

    我目前正在学习pygame 我已经设置了一个窗口并将其设置为全屏 import pygame WIN pygame display set mode 0 0 pygame FULLSCREEN pygame display set capt
  • 通过Java客户端连接Azure服务总线

    我正在尝试使用 AMQP 协议从 Java 客户端连接 Azure 服务总线 我按照以下链接中的说明进行操作 http azure microsoft com en us documentation articles service bus
  • Python pygame 需要帮助同时禁用多个按键

    我创建了一个Frogger游戏原型和我不想允许同时按下两个键进行移动 目前在我的事件函数中我有以下内容 for event in pygame event get check for closing window if event type
  • 来自多个源字段的自动映射器条件映射

    我有一个如下所示的源类 public class Source public Field Fields get set public Result Results get set 并有一个目标类 例如 public class Destin
  • numpy中如何计算两个矩阵的外积?

    我有两个矩阵 A 和 B 大小分别为 NxK 和 MxK 我希望计算大小为 NxMxK 的张量 C 使得 C i j k A i k B j k 如何在 numpy 中有效地实现这一点 所有维度都很大 因此循环不是一种选择 使用循环版本中迭
  • 在 VSCode 中设置 Python 远程调试

    我将远程 ubuntu 16 04 驱动器安装在本地系统 ubuntu 16 04 上 以便我可以通过在 vscode 中打开源文件来编辑源文件 另外 在集成终端中 我可以 ssh 到远程系统并使用安装在虚拟环境中的远程 python 解释
  • Chrome 中不同父元素的 z 索引

    有两个容器 其中一个是固定的并覆盖 100 的屏幕 第二个是相对的 包含可滚动的内容 问题是有四个元素彼此相对定位 如下所示 第一个在固定容器中 第二个在绝对容器中 第三个元素在固定容器中 第四个在绝对容器中 div class conta
  • iOS 等宽自定义字体

    我的 Xcode 7 iOS 9 目标项目中包含自定义字体 我想让字体变成等宽字体 我尝试了这个 但没有成功 let originalFont UIFont name My Custom Font size 18 let originalF
  • 健康损失的迷宫中的最短路径

    假设您有一个由 2D 矩阵表示的地下城 您有一个起点 S x1 y1 和一个终点 E x2 y2 在此过程中 一些细胞中会有一个数字 这些数字会从您的健康得分中减去 其他细胞是你无法跨越的障碍 你一开始有 5 点生命值 你需要找到从 S 到
  • 处理带有空格的名称

    我的 Puppet 代理是 Windows Server 2012 我正在尝试向 AD 用户授予数据库权限 如果我尝试将权限分配给名称中不包含任何空格的 AD 用户 则该脚本可以正常工作 早些时候 不带空格的用户名也不起作用 但是当我添加额
  • 如何将highcharts中的毫秒级json数据格式化为日期格式?

    我从json获取日期数组为1420185600000 1420531200000 1420617600000 1420704000000 1420790400000 1420876800000 如何格式化它以在高图表的 X 轴标签中显示正确
  • 无法在android的服务中启动计时器

    我不知道发生了什么问题 我无法在我的服务中启动计时器 遵循代码 public class BkgService extends Service private Timer ServUpdTimer new Timer private sta
  • 使用 eclipse 插件将修改后的 AST 保存在新文件中

    我有一个 Eclipse 插件代码来操作项目 工作空间中的类 smcho Hello 我可以创建一个 CompilationUnit 并对其进行一些修改 但我需要将结果保存在不同的文件中以检查两个版本之间的差异 这是我获取 Compilat
  • 表格布局固定渲染如何?

    表格布局固定渲染如何 根据 17 5 2 1 固定表格布局 来自 W3 在固定表格布局算法中 每列的宽度确定如下 1 width 属性的值不是 auto 的列元素设置该列的宽度 2 否则 第一行中 width 属性的值不是 auto 的单元
  • Guava 前提条件 checkNull、checkArgument

    我想检查基类的先决条件 以便我知道子类型将始终使用有效的构造函数参数 让我们以一个构造函数为例 需要 2 个或更多参数 接受不同类型的参数 对于一个参数 它执行多次检查 例如 String 不为 nulland不是空的 在这种情况下 如何最