为什么我们不能将断言用于公共方法?

dev*_*per 23 java assert public-method

为什么我们不能将断言用于公共方法?

我在某处读过

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

那么,它也不适用于私人方法吗?
我没有清楚地理解上述陈述

Pet*_*rey 26

重要的区别在于您是否认为不正确的值是结果

a)应该在代码中修复的编程错误.

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

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


IMHO断言用于检测编程错误,而不是用户/外部输入.当你有一个不被外部输入调用的公共方法时,作者可能会将公共方法混淆为外部输入.

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

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


z7s*_*g Ѫ 16

由于以下原因,断言不应用于检查公共方法中的参数:

  • 断言可以被禁用,并且绝不应禁用参数检查,因为它们是方法与其调用者的合同的一部分
  • 断言失败不会为无效参数抛出适当的异常.

例:

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

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