3

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

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

为什么是这样?

4

2 回答 2

4

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

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

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

那么,为什么可以将它用于公共方法中的后置条件呢?

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

前提条件——调用方法时必须满足的条件。后置条件——方法成功完成后必须为真。

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

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

于 2017-11-12T23:33:01.547 回答
4

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

于 2017-11-12T23:06:47.530 回答