操作导入改变java行为
Java已打消的一种特性是C的“条件编译”,它答允我们改变参数,得到差异的行为,同时不改变其他任何代码。Java之所以丢弃了这一特性,大概是由于该特性常常在C里用于办理跨平台问题:代码的差异部门按照详细的平台举办编译,不然不能在特定的平台上运行。由于Java的设计思想是成为一种自动跨平台的语言,所以这种特性是没有须要的。
然而,条件编译尚有另一些很是有代价的用途。一种很常见的用途就是调试代码。调试特性可在开拓进程中利用,但在刊行的产物中却无此成果。Alen Holub(www.holub.com)提出了操作包(package)来仿照条件编译的观念。按照这一观念,它建设了C“断定机制”一个很是有用的Java版本。之所以叫作“断定机制”,是由于我们可以说“它应该为真”可能“它应该为假”。假如语句差异意你的断定,就可以发明相关的环境。这种东西在调试进程中是出格有用的。
可用下面这个类举办措施调试:
//: Assert.java // Assertion tool for debugging package com.bruceeckel.tools.debug; public class Assert { private static void perr(String msg) { System.err.println(msg); } public final static void is_true(boolean exp) { if(!exp) perr("Assertion failed"); } public final static void is_false(boolean exp){ if(exp) perr("Assertion failed"); } public final static void is_true(boolean exp, String msg) { if(!exp) perr("Assertion failed: " + msg); } public final static void is_false(boolean exp, String msg) { if(exp) perr("Assertion failed: " + msg); } } ///:~
这个类只是简朴地封装了布尔测试。假如失败,就显示出堕落动静。在第9章,各人还会进修一个更高级的错误节制东西,名为“违例节制”。但在今朝这种环境下,perr()要领已经可以很好地事情。
假如想利用这个类,可在本身的措施中插手下面这一行:
import com.bruceeckel.tools.debug.*;
如欲排除断定机制,以便本身能刊行最终的代码,我们建设了第二个Assert类,但却是在一个差异的包里:
//: Assert.java // Turning off the assertion output // so you can ship the program. package com.bruceeckel.tools; public class Assert { public final static void is_true(boolean exp){} public final static void is_false(boolean exp){} public final static void is_true(boolean exp, String msg) {} public final static void is_false(boolean exp, String msg) {} } ///:~
此刻,如果将前一个import语句酿成下面这个样子:
import com.bruceeckel.tools.*;
措施便不再显示出断言。下面是个例子:
//: TestAssert.java // Demonstrating the assertion tool package c05; // Comment the following, and uncomment the // subsequent line to change assertion behavior: import com.bruceeckel.tools.debug.*; // import com.bruceeckel.tools.*; public class TestAssert { public static void main(String[] args) { Assert.is_true((2 + 2) == 5); Assert.is_false((1 + 1) == 2); Assert.is_true((2 + 2) == 5, "2 + 2 == 5"); Assert.is_false((1 + 1) == 2, "1 +1 != 2"); } } ///:~
通过改变导入的package,我们可将本身的代码从调试版本酿成最终的刊行版本。这种技能可应用于任何种类的条件代码。