验证私有辅助方法的参数

Validating private helper method's parameters

我正在阅读 J. Bloch 的 Effective Java,现在我正在阅读有关验证方法参数的部分。他说了以下内容:

For an unexported method, you as the package author control the circumstances under which the method is called, so you can and should ensure that only valid parameter values are ever passed in. Therefore, nonpublic methods should generally check their parameters using assertions.

这是书中的例子:

// 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 并发现:

An assertion is either enabled or disabled. [...] If the assertion is disabled, execution of the assertion has no effect whatsoever.

我从来没有在代码中使用过 assert 语句,所以对我来说它似乎很容易出错,因为如果碰巧断言被禁用,它可能会导致难以检测到的错误出现。而且他还这样说:

你不能澄清他说的重点吗?

我的意思是,为什么我们不对 public 方法也使用 assert

我认为断言的主要用途应该是检测程序中的错误,您将能够修复它们。

请务必注意,它们可以启用禁用。如果您使用它们来验证参数,您 想要 public 方法忽略断言 - public 方法的参数检查应该是 总是 完成(当然,如果需要的话)。

另外需要注意的是,断言不提供信息,由于断言错误可以检索的消息是:

AssertionFailedException ...

这不像抛出信息异常那样有用,它会指示错误是什么以及为什么,这对调用者非常有帮助。