我正在阅读Oracle documentation关于使用assert
关键字来验证方法前置条件和后置条件。
该文档表明,使用assert
关键字验证public
方法的后置条件是合适的,但您应该只使用assert
关键字来验证{{private
的先决条件1}}方法。
为什么会这样?
答案 0 :(得分:4)
在所有情况下,您应该检查public
函数的参数。如果assert
被禁用,则如果通过assert
实施,则无法完成此类检查。
答案 1 :(得分:4)
完整的答案,而不是将其转储到评论中。
为什么我不应该在公共方法中使用断言进行参数检查?
可以通过JVM标志禁用依赖assert
的断言。因此,当用户运行代码时,无法保证断言确实会运行。这就是为什么如果你无法保证它会发生,那么在你的API中做出承诺会抛出验证错误是不好的。因此,您允许用户使用无效参数呼叫您,而不会抛出异常来警告它们。您应该使用运行时异常。
那么,为什么将它用于公共方法的后置条件呢?
您引用的文档定义了前后条件,如下所示:
前提条件 - 调用方法时必须如此。 后置条件 - 方法完成后必须为真 成功。
您可以看到前置条件取决于调用者,而后置条件取决于被调用者。如果满足前置条件,后置条件可能失败的唯一原因是因为方法中的代码是错误的。这不是用户错误,这是库本身的问题。我猜这就是为什么该文档认为最终导致残疾的后置条件断言的问题较少。
我不确定我个人是否同意,因为如果不满足后期条件,则可能意味着该方法的合同已被违反,执行应该停止。取决于后置条件的重要性。 API编写者可能希望在动态数组调整大小结束时检查一些比率对于性能是否最佳,但如果不是这种情况则不一定抛出异常,因为即使使用次优比率,程序仍将按预期运行。 / p>