我在GWT代码中找到了某个地方,就是这样的
assert display instanceof Widget : "display must extend Widget";
Bru*_*eis 11
该assert
关键字,顾名思义,使一个说法有关的代码.它用于指定一直保持为真的东西 - 或者至少应该是真的!
的assert
关键字之后是布尔值(true
或false
),或表达,在运行时进行评估,即返回一个布尔值.
assert true;
assert 1 == 1;
Run Code Online (Sandbox Code Playgroud)
如果由于任何原因,布尔表达式的计算结果为false,则AssertionError
抛出a.
// this will throw an AssertionError:
int x = 1;
assert x == 2;
Run Code Online (Sandbox Code Playgroud)
当您使用它时,您可以清楚地说明程序在给定点上的状态,这可以使读者更容易理解您的代码.
有一种称为程序合同的编程范例,其中代码段生成关于前提条件的陈述,这些前置条件必须适用于它们才能正确执行,以及后置条件,它们在执行后保证成立.您可以使用该assert
关键字来实现此目的.
例如,如果您编写一个计算数字平方根的方法,它只适用于大于或等于零的数字,并且保证结果满足相同的条件:
public double sqrt(final double x) {
assert x >= 0 : "Cannot calculate the square root of a negative number!"
double result = ...;
assert result >= 0 : "Something went wrong when calculating the square root!"
return result;
}
Run Code Online (Sandbox Code Playgroud)
断言最有趣的方面是你可以要求编译器将它们从字节码中删除(通过-disableassertion
参数),这样你就不会在生产运行时获得任何性能损失.由于这个确切的原因,要评估的表达式不会引起副作用是至关重要的,也就是说,表达式应该看起来像纯粹的数学函数.否则,如果编译器删除了断言,程序的行为可能会改变.
最后,如果将断言编译为字节码,则可以通过软件读取它们,该软件将自动生成将尝试破坏代码的测试.之前发现错误会很有用!