2013-04-09 69 views
5

我想编写一些故障诊断代码,我可以从后来的非调试版本的程序中轻松地删除它。我想出了:Java对if语句的最终变量有多聪明

final static boolean debug_on=true; 
... 
if (debug_on) { system.out.println() or logger.log(...) } 

就是Java足够聪明,如果调试== false,以最终字节码落if语句?

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

+0

你检查了字节码吗? – PermGenError 2013-04-09 15:50:41

+2

这看起来应该很容易测试 - 编译,然后使用javap来查看字节码。 (我期望它被JIT优化,而不是javac) – 2013-04-09 15:50:51

+0

真的值得通过使用最终变量来优化这个(测试)吗?通常,一个使用日志框架,然后写入语句,如'if(log.isDebugEnabled())log.debug(“blah”+ x);'。每次执行测试,但不评估“blah”+ x'。 – 2013-04-09 16:02:06

回答

5

Java language specification chapter 14.21. Unreachable Statements的结尾的if(false)的描述:

if (false) { x=3; } 

不会导致一个编译时间错误。优化编译器可能会认识到x=3;将永远不会执行,并且可能会选择 从生成的类文件中省略该语句的代码,但不会在此处指定的技术 意义上将“x=3;”语句视为“不可达” 。

这种区别对待的理由是让程序员 定义“标志变量”,如:

static final boolean DEBUG = false; 

,然后编写代码,如:

if (DEBUG) { x=3; } 

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

tl; dr;它取决于编译器是否在字节码中省略if中的语句。

+0

无法访问的语句!没想到要用这个名字来查找它。谢谢 ! – 2013-04-09 16:00:20