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

Precondition and postcondition checks in public methods

我正在阅读 Oracle documentation 关于使用 assert 关键字来验证方法前置条件和后置条件的内容。

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

这是为什么?

在所有情况下,您都应该检查 public 函数的参数。如果 assert 被禁用,那么如果通过 assert 实现这种检查将不会完成。

一个完整的答案而不是在评论中倾倒它。

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

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

那么,为什么可以在 public 方法中将其用于 post 条件?

您引用的文档定义了 pre 和 post 条件如下:

Preconditions — what must be true when a method is invoked. Postconditions — what must be true after a method completes successfully.

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

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