如果我有一个布尔字段,如:Java的预处理器
private static final boolean DEBUG = false;
和我的代码中我有这样的语句:
if(DEBUG) System.err.println("err1");
并在Java预处理器刚刚得到,如果摆脱了声明和无法访问的代码?
如果我有一个布尔字段,如:Java的预处理器
private static final boolean DEBUG = false;
和我的代码中我有这样的语句:
if(DEBUG) System.err.println("err1");
并在Java预处理器刚刚得到,如果摆脱了声明和无法访问的代码?
大多数编译器将消除该声明。例如:
public class Test {
private static final boolean DEBUG = false;
public static void main(String... args) {
if (DEBUG) {
System.out.println("Here I am");
}
}
}
编译这个类之后,然后我通过javap
命令打印的生产指令的列表:
javap -c Test Compiled from "Test.java" public class Test extends java.lang.Object{ public Test(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: return }
正如你所看到的,没有System.out.println
! :)
+1了解如何自行测试的说明。 – akf
另外,我检查了什么时候你有一个类似'if(DEBUG && condition_that_may_be_true)...'的语句,如果DEBUG总是假,它就会将其切断。 – twolfe18
+1模型答案 – butterchicken
是的,Java编译器将消除由常量控制的if
块内的编译代码。这是一种可接受的方式,用于有条件地编译不想包含在生产版本中的“调试”代码。
你可以给Java语言规范页面说明这一点吗? – Ralph
@Ralph:参见JLS中讨论的[14.21 Unreachable Statements](http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.21)。关于“if”语句的位在该段的结尾附近。 –
页面现在在这里用于jse7:http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21以及jse5的这里:http://docs.oracle.com /javase/specs/jls/se5.0/html/statements.html#14.21 –
“Java语言没有预处理器”(http://java.sun.com/developer/JDCTechTips/2003/tt0408.html)您是否在谈论Java编译器? –
感谢您的文章,我不知道Java没有预处理器。所以我只是谈论编译器。 – twolfe18
确实,Java没有一个与C/C++具有相同功能的预处理器。但它确实有提供编译时处理的注释处理器。请参阅[Oracle的注释教程](http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html) – KomodoDave