我正在阅读J. Bloch的Effective Java,现在我正在讨论验证方法参数的部分。他说以下内容:
对于未导出的方法,您作为包作者控制 调用方法的情况,所以你可以和 应该确保只传入有效的参数值。 因此,非公开方法通常应检查其参数 使用断言 。
这是本书的例子:
// Private helper function for a recursive sort
private static void sort(long a[], int offset, int length) {
assert a != null;
assert offset >= 0 && offset <= a.length;
assert length >= 0 && length <= a.length - offset;
// Do the computation
}
我没有看到强调句子如何确保参数值有效。此外,我咨询了JLS 14.10并发现了这个:
启用或禁用断言。 [...] 如果断言 被禁用,断言的执行没有任何效果。
我从来没有在代码中使用assert语句,所以对我来说它似乎容易出错,因为如果它发生断言被禁用,它可能会导致几乎没有检测到的错误出现。他还说了这个:
难道你不清楚他说的是什么意思吗?
我的意思是,为什么我们不将assert
用于公共方法呢?
答案 0 :(得分:2)
我认为断言的主要用法应该是检测程序中的错误,以便能够修复它们。
需要注意的是,他们可以启用和禁用。如果您正在使用它们来验证参数,那么不要希望public
方法忽略断言 - public
方法的参数检查应该始终完成(当然,如果需要)。
另外需要注意的是,断言不能提供信息,因断言错误而可以检索的消息是:
AssertionFailedException ...
这没有用,比如抛出信息异常,表明错误是什么以及为什么,这对调用者非常有帮助。