使用checkState而不是assert有什么好处吗?我记得在某个地方读到我应该更喜欢checkState,但我记不起为什么。
答案 0 :(得分:2)
checkState
和assert
的目的完全不同。
checkState
是前置条件检查,如果调用方在程序处于该方法可能不属于的状态时调用您的方法,则会引发异常调用。 (这意味着他们错误地使用了您的代码;他们应该能够通过正确使用它来避免在错误的时间调用该方法。)
assert
通常最多是对您知道必须在程序中的某个位置(某种已编译的注释)的内容进行完整性检查。此外,根据启动JVM时的标志,可以启用或禁用assert
。在生产中禁用它是典型的。因此,即使你以某种方式进入一种你无法断言的状态,你也不能依赖它来打破方法的流程。
Guava的新版本(截至17.0)Verify
类类似assert
,总是启用,但不完全正确;它适用于不应发生的情况,但如果某些外部服务(即您的代码正在调用的服务,而不是调用您的代码)可能会以其声称不应该的方式运行。有关Preconditions
,assert
和Verify
之间差异的更多信息,请参阅其Javadoc。