公共方法中的前置条件和后置条件检查

Oge*_*gen 3 java assert preconditions post-conditions

我正在阅读有关使用关键字验证方法前置条件和后置条件的Oracle 文档。assert

该文档说,可以使用assert关键字来验证public方法的后置条件,但您应该只使用assert关键字来验证private方法的前置条件。

为什么是这样?

Dic*_*ici 5

一个完整的答案,而不是把它扔在评论中。

\n\n

为什么我不应该在公共方法中使用断言进行参数检查?

\n\n

依赖的断言assert可以通过 JVM 标志来禁用。因此,无法保证当您的用户运行您的代码时断言确实会运行。这就是为什么如果你不能真正保证它会发生的话,那么在你的 API 中做出抛出验证错误的承诺是不好的。因此,您允许用户使用无效参数调用您,而不会抛出异常来警告他们。您应该改用运行时异常。

\n\n

那么,为什么可以在公共方法中使用它作为后置条件呢?

\n\n

您引用的文档定义前置条件和后置条件如下:

\n\n
\n

前置条件 \xe2\x80\x94 调用方法时必须为 true 的内容。\n 后置条件 \xe2\x80\x94 方法成功完成后必须为 true 的内容。\n

\n
\n\n

您可以看到前置条件取决于调用者,而后置条件取决于被调用者。如果满足前置条件,则后置条件失败的唯一原因是方法中的代码有错误。这不是用户的错误,而是库本身的问题。我猜这就是为什么文档认为最终禁用后置条件断言的问题较少。

\n\n

我不确定我个人是否同意,因为如果不满足后置条件,则可能意味着该方法的约定已被违反并且执行应该停止。取决于后置条件的严重程度。API 编写者可能希望在动态数组调整大小结束时检查某些比率对于性能是否最佳,但如果不是这种情况,则不一定会抛出异常,因为即使比率不是最佳,程序仍会按预期运行。

\n