这个断言只会弄乱你的代码,它相当于这个断言:
boolean a = true;
assert a : "A should be true"
您不应该测试您的 JVM,除非这是您的程序的重点(例如,它是您正在制作的 JVM 的测试套件)。相反,您应该测试您的前置条件、后置条件和不变量。有时这些测试太基础或太昂贵。
前置条件可能只应该出现在方法的开头(如果您有很长的方法,那么您应该将该方法分成小部分,即使它们都是私有的)。
后置条件应该清楚您返回给调用者的内容,您不测试 sqrt 函数是否只返回了 sqrt,但您可能会测试它是肯定的以明确您的期望(也许稍后的代码使用复数,而您的未对此进行测试)。而是在底部留下评论。
不变量通常也无法测试,您无法测试您当前的解决方案是否是正确的部分解决方案(见下文)——尽管这是使用尾递归编写东西的好处之一。相反,您使用注释声明不变量。
如果您在外部调用事物,您还将使用断言,例如在您的示例中,如果您有ArrayList.Create()
,那么您可以选择断言检查null
。但这只是因为您不信任其他代码。如果您编写了该代码,则可以将断言(注释或其他)放在工厂方法本身中。
int max(int[] a, int n) {
assert n <= a.length : "N should not exceed the bounds of the array"
assert n > 0 : "N should be at least one"
// invariant: m is the maximum of a[0..i]
int m = a[0];
for( int i = 1; i < n; n++ ) {
if( m < a[i] )
m = a[i];
}
// if these were not basic types, we might assert that we found
// something sensible here, such as m != null
return m;
}