| |
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,我们可将自己的代码从调试版本变成最终的发行版本。这种技术可应用于任何种类的条件代码。
|
|