关于带有最终变量的语句,Java有多聪明

Ria*_*ser 5 java debugging if-statement final

我想写一些故障排除代码,我可以从以后的非调试版本的程序中轻松删除.我提出了:

final static boolean debug_on=true;
...
if (debug_on) { system.out.println() or logger.log(...) }
Run Code Online (Sandbox Code Playgroud)

如果debug == false,Java是否足够智能从最终字节码中删除if语句?

有没有更好的做法来实现将调试代码保留在程序的最终版本之外的目标?

hal*_*lex 5

请参阅Java语言规范第14.21章的结尾.无法访问的语句 描述if(false):

if (false) { x=3; }
Run Code Online (Sandbox Code Playgroud)

不会导致编译时错误.优化编译器可能会意识到该语句x=3;永远不会被执行,并且可能会选择从生成的类文件中省略该语句的代码,但该语句x=3;在此处指定的技术意义上不被视为"无法访问".

这种不同处理的基本原理是允许程序员定义"标志变量",例如:

static final boolean DEBUG = false;
Run Code Online (Sandbox Code Playgroud)

然后编写如下代码:

if (DEBUG) { x=3; }
Run Code Online (Sandbox Code Playgroud)

我们的想法是,应该可以将DEBUG的值从false更改为true或从true更改为false,然后正确编译代码而不对程序文本进行其他更改.

TL;博士; 这取决于编译器是否在字节码中省略了if中的语句.