为什么我们不能对公共方法使用断言?

2022-09-01 22:05:15

为什么我们不能对公共方法使用断言?

我在某处读过

“断言在公共方法中是不合适的,因为该方法保证它将始终强制执行参数检查。公共方法必须检查其参数是否启用了断言。此外,assert 构造不会引发指定类型的异常。它只能抛出一个“.AssertionError

那么,它是否也适用于私有方法?
我没有清楚地理解上述说法


答案 1

重要的区别在于你是否认为不正确的值是以下结果:

a) 一个应该在代码中修复的编程错误。

b) 无法在代码中阻止的输入错误,而是需要在运行时处理。

对于第一种情况,您应该使用断言,因为程序代码需要修复。如果是后一种情况,则应使用适当的运行时或检查异常。


恕我直言,断言用于检测编程错误,而不是用户/外部输入。也许作者将公共方法混淆为外部输入,因为您将拥有未由外部输入调用的公共方法。

我会使用断言来检查参数以检测编程错误。恕我直言,这通常是他们的最佳用途。相比之下,私有方法应该只由同一类中的代码调用,你应该期望它们是良好的单元测试,并且具有有限的可能的访问/用法。

我发现你更有可能通过公共接口出现编程错误,因为不同的人做出不同的假设(断言是记录和检查假设的好方法)内部检查并不像你期望的同一个程序员在没有编写整个内部代码库时可以访问内部代码那样有用。


答案 2

不应使用断言来检查公共方法中的参数,原因如下:

  • 可以禁用断言,并且永远不应禁用参数检查,因为它们是方法与其调用方的协定的一部分
  • 断言失败不会为无效参数引发适当的异常。

例:

    /**
     * @throws ArithmeticException if divisor is zero
     */ 
    public void int divide(int divisor) {
        if (divisor == 0) {
            throw new ArithmeticException("Cannot divide by zero");
        }
        ...
    }

如果你在这里使用了一个断言,它可能会被关闭,它会抛出一个,这是无益的,没有信息的。AssertionFailedException


推荐