我最近在看《Java编程思想》,看到第六章的6.1.4小节【用import改变行为】时稍微有点迷惑。唉,英文不好看中文版就是这样,翻译后的有些文字很难看明白(╯﹏╰)。书中提到"通过修改被导入的package"来实现条件编译,于是,我就试了试,大概是下面这样:
首先,在debug包和realease包下分别有一个Cookie类,如下:
debug包内的Cookie:
package com.example.test.debug;
public class Cookie {
public Cookie() {
System.out.println("Debug Cookie.");
}
}
realease包内的Cookie:
package com.example.test.realease;
public class Cookie {
public Cookie() {
System.out.println("Realease Cookie.");
}
}
然后,在其他包中的Startup类中使用debug包内的Cookie:
package com.example.test;
import com.example.test.debug.*;
public class Startup {
public static void main(String[] args) {
Cookie cookie = new Cookie();
}
}
运行结果如下:
Debug Cookie.
这样,只需要修改"import com.example.test.debug.*",将其改为"import com.example.test.realease.*"就可以使用realease包内的Cookie类了:
package com.example.test;
import com.example.test.realease.*;
public class Startup {
public static void main(String[] args) {
Cookie cookie = new Cookie();
}
}
运行结果如下:
Realease Cookie.
我觉得书中就是想通过这种方式来进行条件编译,以实现代码的切换。但是,这样需要维护两套代码,不知道是不是大公司会这样做。其实,正常开发中我们使用日志的logger.isDebugEnabled()方法时就使用了条件编译。如下示例:
public class Test { public final static boolean isDebugEnabled = true; public static void main(String[] args) { if (isDebugEnabled) { System.out.println("print debug log..."); } } }
我们将其编译为class文件,再反编译如下:
public class Test { public static final boolean isDebugEnabled = true; public Test() { } public static void main(String[] var0) { System.out.println("print debug log..."); } }
然后,将isDebugEnabled改为false再编译为class,再反编译如下:
public class Test { public static final boolean isDebugEnabled = false; public Test() { } public static void main(String[] var0) { } }
我们可以看到,在反编译的代码中没有了"System.out.println("print debug log...");"这条语句。这是因为isDebugEnabled的值为false,所以这个if判断里面的代码路径不会被执行,因此编译器自动进行了优化。
大概日志的logger.isDebugEnabled()的原理也是这样,感觉又学习到一些东西,这篇笔记到此为止吧(~^o^~)。