Java 断言未得到充分利用

2022-08-31 14:38:38

我想知道为什么这个关键字在Java中如此未被充分利用?我几乎从未见过它们被使用过,但我认为它们是一个好主意。我当然更喜欢简洁明了:assert

assert param != null : "Param cannot be null";

到以下各项的详细程度:

if (param == null) {
    throw new IllegalArgumentException("Param cannot be null");
}

我怀疑它们没有得到充分利用,因为

  • 他们到达的时间相对较晚(Java 1.4),当时许多人已经建立了他们的Java编程风格/习惯。
  • 默认情况下,它们在运行时处于关闭状态

答案 1

从理论上讲,断言用于测试不变量,即必须为真才能正确完成代码的假设。

显示的示例正在测试有效输入,这不是断言的典型用法,因为它通常是用户提供的。

断言通常不用于生产代码中,因为存在开销,并且假定在开发和测试期间不变量失败的情况已被捕获为编码错误。

你关于他们“迟到”到java的观点也是他们没有更广泛地看到的原因。

此外,单元测试框架允许将编程断言放在被测试代码的外部。


答案 2

使用它们来测试用户输入是对断言的滥用。抛出一个 on 无效输入更正确,因为它允许调用方法捕获异常,显示错误,并执行它需要执行的任何操作(再次请求输入,退出,等等)。IllegalArgumentException

如果该方法是其中一个类中的私有方法,则断言没有问题,因为您只是试图确保不会意外地向它传递 null 参数。在打开断言的情况下进行测试,并且当您测试了所有通过的路径但未触发断言时,可以将其关闭,这样就不会浪费资源。它们也作为注释有用。方法的开头是维护者的良好文档,他们应该遵循某些前提条件,最后是后置条件,记录了方法应该做什么。它们可以与评论一样有用;更重要的是,因为有了断言,他们实际上测试了他们记录的内容。assertassert

断言用于测试/调试,而不是错误检查,这就是为什么它们默认处于关闭状态的原因:阻止人们使用断言来验证用户输入。


推荐