为什么在java中的assert
是一个关键字,而不是一个方法?在Java中,为什么要声明关键字而不是方法?
方法断言看起来是这样的:
public static void assert(boolean condition) {
if(!condition) {
throw new AssertionError();
}
}
为什么在java中的assert
是一个关键字,而不是一个方法?在Java中,为什么要声明关键字而不是方法?
方法断言看起来是这样的:
public static void assert(boolean condition) {
if(!condition) {
throw new AssertionError();
}
}
回答这个问题是可以在The Java® Language Specification
断言是一个包含布尔表达式的断言语句。断言是启用还是禁用。如果启用了断言,断言的执行会导致评估布尔表达式,并且如果表达式计算结果为false,则会报告错误。如果断言被禁用,则断言的执行没有任何效果。
所以,如果assert
是一个方法,那么这样的代码:
assert(check());
将总是调用check
方法,无论断言是否启用或禁用。
现在,由于assert
是具有特殊处理的关键词(如上所述)的check
方法将被调用仅当断言为才启用此断言的布尔表达式进行评价。
一个可能的原因是断言可以被启用或禁用 - 这在使用关键字而不是方法的Java(一种没有预处理器的语言)中更好地建模,因为假设一个方法是代码总是运行(即使断言被禁用时,编译器也可以删除方法调用)。
将此与例如以下的断言对比。 C或C++,在那里你有一个预处理器 - 在这种情况下,根据是否定义一个特定的预处理器标志来预处理这些断言就足够了。
可以在不更改代码的情况下打开和关闭Java断言。这样可以避免生产中断言的运行时间开销,同时利用其在开发环境中的调试价值。
在应用程序代码中作为方法调用实现的断言无法执行。即使这种方法可以根据每个环境的需要进行短路或短路,循环总是通过方法调用和测试来确定是否激活。
实际上,Java声明关键字并不流行,至少在目前这个时候没有。断言更常用于JUnit测试,正如其他海报所触及的。在JUnit世界中,断言是方法调用。由于它们不在主线代码中,因此它们在生产中没有开销;它们在单独的测试代码中,只能在开发环境中运行。