在Java中,为什么断言关键字而不是方法?

时间:2013-05-27 22:55:15

标签: java methods assert

为什么java中的assert是关键字,而不是方法?

方法断言可能如下所示:

public static void assert(boolean condition) {
    if(!condition) {
        throw new AssertionError();
    }
}

3 个答案:

答案 0 :(得分:9)

The Java® Language Specification

中提供了此问题的答案
  

断言是包含布尔表达式的断言语句。断言被启用或禁用。如果断言已启用,则断言的执行会导致对布尔表达式进行求值,如果表达式求值为false,则会报告错误。如果断言被禁用,则断言的执行不会产生任何影响。

所以,如果assert是一种方法,那么这样的代码:

assert(check());

始终调用check方法,无论是启用还是禁用断言。

现在,由于assert是一个具有特殊处理的关键字(如上所述),因此当启用断言时,check方法将仅被称为 <将评估此断言的布尔表达式。

答案 1 :(得分:2)

可以在不更改代码的情况下打开和关闭Java断言。这样就可以避免生产中断言的运行时开销,同时在开发环境中利用它们的调试值。

作为应用程序代码中的方法调用实现的断言也不会执行。即使该方法可以根据需要对每个环境进行短路,也可以通过方法调用和测试来确定循环是否有效。

实际上,Java断言关键字并不受欢迎,至少目前还不行。在JUnit测试中,断言更常见,正如其他海报所触及的那样。在JUnit世界中,断言方法调用。它们不会在生产中产生任何开销,因为它们不在主线代码中;它们位于仅在开发环境中运行的单独测试代码中。

答案 2 :(得分:1)

一个可能的原因是可以启用或禁用断言 - 这在Java(没有预处理器的语言)中使用关键字而不是方法更好地建模,因为使用方法的假设是代码将始终运行(即使断言被禁用,也可以让编译器删除方法调用。)

将此与例如断言相对照。 C或C ++,你有一个预处理器 - 在这种情况下,它足以根据是否定义了特定的预处理器标志来预处理断言。