为什么assert
在java中是关键字而不是方法?
方法 assert 可能如下所示:
public static void assert(boolean condition) {
if(!condition) {
throw new AssertionError();
}
}
Java® 语言规范中提供了此问题的答案
断言是包含布尔表达式的断言语句。断言被启用或禁用。如果启用了断言,则执行断言会导致对布尔表达式求值,如果表达式求值为 false,则会报告错误。如果断言被禁用,则断言的执行没有任何效果。
所以,如果assert
是一种方法,那么这样的代码:
assert(check());
将始终调用该check
方法,无论断言是启用还是禁用。
现在,由于assert
是一个具有特殊处理的关键字(如上所述),因此只有check
在启用断言时才会调用该方法,因为只有这样才会评估此断言的布尔表达式。
无需更改代码即可打开和关闭 Java 断言。这使得可以避免生产中断言的运行时开销,同时利用它们在开发环境中的调试价值。
在应用程序代码中实现为方法调用的断言不会执行得那么好。即使方法可以根据每个环境的需要短路或不短路,方法调用和测试总是会烧掉循环以确定它是否处于活动状态。
在实践中,Java assert 关键字并不流行,至少目前不流行。断言在 JUnit 测试中实现的频率要高得多,正如其他海报所涉及的那样。在 JUnit 世界中,断言是方法调用。它们不会在生产中产生开销,因为它们不在主线代码中;它们位于仅在开发环境中运行的单独测试代码中。
一个可能的原因是可以启用或禁用断言——这在 Java(一种没有预处理器的语言)中使用关键字而不是方法更好地建模,因为使用方法的假设是代码将始终运行(即使它如果断言被禁用,则可以使编译器删除方法调用)。
将此与例如 C 或 C++ 中的断言进行对比,在这种情况下,您有一个预处理器 - 在这种情况下,根据是否定义了特定的预处理器标志来预处理断言就足够了。