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,我們可將自己的代碼從調試版本變成最終的發行版本。這種技術可應用於任何種類的條件代碼。