我正在阅读关于使用Oracle文档关键字验证方法、先决条件和后置条件的assert
。
文档说,使用assert
关键字来验证public
方法的后置条件是可以的,但是您应该只使用assert
关键字来验证private
方法的先决条件。
为什么会这样呢?
发布于 2017-11-12 23:33:01
一个完整的答案,而不是把它扔在评论里。
为什么我不应该在公共方法中使用断言来检查参数?
依赖于assert
的断言可以被JVM标志禁用。因此,无法保证断言在用户运行代码时确实会运行。这就是为什么如果您不能真正保证会发生验证错误,那么在API中抛出验证错误是很糟糕的。因此,您允许用户使用无效的参数调用您,而无需抛出异常来警告它们。您应该使用运行时异常。
那么,为什么在公共方法中将其用于后置条件很好呢?
您引用的文档定义了前和后条件如下:
先决条件-在调用方法时必须是正确的。后置条件-在方法成功完成后必须是真的。
您可以看到,前置条件取决于调用方,而后置条件取决于被调用方。如果满足了预条件,那么后置条件可能失败的唯一原因是因为方法中的代码是错误的。这不是用户的错误,而是库本身的问题。我猜这就是为什么医生认为用禁用的后置条件断言结束问题较少的原因。
我不确定我个人是否同意,因为如果不满足后条件,这可能意味着该方法的合同已经被违反,执行应该停止。取决于后状态有多严重。API编写者可能希望在调整动态数组大小的末尾检查某些比率对于性能而言是最优的,但如果情况并非如此,则不一定会抛出异常,因为即使存在次优比率,程序仍然会按预期的方式运行。
发布于 2017-11-12 23:06:47
在所有情况下,您都应该检查public
函数的参数。如果禁用了assert
,则如果通过assert
实现这种检查就无法完成。
https://stackoverflow.com/questions/47254997
复制相似问题