Think in java里的一个问题

jasper 2001-07-19 06:54:44
在TIJ第五章里有这么一段内容:
我看不懂,里面的“断定机制”是一个什么东西,它起什么作用?谁能给我讲讲,不胜感谢!

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,我们可将自己的代码从调试版本变成最终的发行版本。这种技术可应用于任何种类的条件代码。
...全文
78 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jasper 2001-07-21
  • 打赏
  • 举报
回复
是不是和下面的c程序一样:
#define DEBUG;
...
void main(){
if(DEBUG)
.....
}
mailtojack 2001-07-21
  • 打赏
  • 举报
回复
类名相同,而所在的包不同,
通过引用不同的包,达到使用不同
的类的结果。
kuai_kevin 2001-07-21
  • 打赏
  • 举报
回复
就是断言嘛,c语言中很常用的技巧。
buding 2001-07-19
  • 打赏
  • 举报
回复
“断定机制”的意思是我们断定某个条件必定成立,如果不成立,说明程序发生了致命错误,在C++中会使该程序崩溃。在JAVA中我们做两个Assert类(上面一个和下面一个,姑且称它为Assert1和Assert2),其中Assert1写在package com.bruceeckel.tools.debug中,它会在打印出信息;Assert2写在package com.bruceeckel.tools中,它不会在打印出信息。我们调试程序时要看信息,要用Assert1,import com.bruceeckel.tools.debug.*;
;而最终的发行版本不需要打印出信息,故用Assert2,import com.bruceeckel.tools.*;。
luodi 2001-07-19
  • 打赏
  • 举报
回复
调试的工具,参见标准C/C++ 中的 assert.h 中关于 ASSERT 的定义。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧