qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          從思路開始 Java如何實現(xiàn)條件編譯

           條件編譯絕對是一個好東西。如在C或CPP中,可以通過預(yù)處理語句來實現(xiàn)條件編譯。代碼如下:

        1. #IFDEF DEBUG 
        2. #UNDEF DEBUG 
        3. #ENDIF 
        4. #define DEBUG 
        5. #IFDEF DEBUUG 
        6.   /* 
        7.    code block 1 
        8.    */ 
        9. #ELSE 
        10.   /* 
        11.    code block 2 
        12.   */ 
        13. #ENDIF
        14.   但是在JAVA中卻沒有預(yù)處理,宏定義這些東西,而有時在一些項目中,我們又需要條件編譯。那么,在JAVA中,該如何實現(xiàn)條件編譯呢?

            我們來看一個例子。

            編寫一個helloworld程序。代碼如下:

        15. public class Hello { 
        16.     public static void main(String[] args) { 
        17.         System.out.println("Hello, world!"); 
        18.     } 
        19. }
        20.   保存為Hello.java并編譯,得到一個class文件,并且觀察到文件大小是417字節(jié)。然后我們對這個文件進行反編譯,用jd-gui。得到代碼如下:

        21. import java.io.PrintStream; 
        22. public class Hello 
        23.   public static void main(String[] paramArrayOfString) 
        24.   { 
        25.     System.out.println("Hello, world!"); 
        26.   } 
        27. }
        28.   得到這個有什么用呢?

            現(xiàn)在我們再來對源代碼進行修改,修改后的代碼如下。

        29. public class Hello { 
        30.     public static void main(String[] args) { 
        31.         if(false) { 
        32.             System.out.println("Hello, world!"); 
        33.         } 
        34.     } 
        35. }
        36.   進行編譯,這時我們再看它的大小,只有255字節(jié)。怎樣?想到什么了吧?沒錯,編譯器會對代碼進行優(yōu)化,對于條件永遠(yuǎn)為false的語句,JAVA編譯器將不會對其生成字節(jié)碼。下面我們再來對該class文件進行反編譯,果然代碼如下:

        37. public class Hello 
        38.   public static void main(String[] paramArrayOfString) 
        39.   { 
        40.   } 
        41. }


        42.  利用JAVA編譯的這一優(yōu)化機制,我們就可以實現(xiàn)JAVA的條件編譯了。

        43. public class Hello { 
        44.     public static void main(String[] args) { 
        45.         if(false) { 
        46.             System.out.println("Hello, world!"); 
        47.         } 
        48.     } 
        49. }
        50.   定義一個final的變量,然后再在if語句中使用。代碼如下:

        51. public class Hello { 
        52.     public static void main(String[] args) { 
        53.         final boolean DEBUG = true
        54.         if(DEBUG) { 
        55.             System.out.println("Hello, world!"); 
        56.         } 
        57.     } 
        58. }
        59.   當(dāng)條件編譯使用得多時,上面將極不利于代碼的修改及維護,這時就可以用一種更為靈活的方法。定義一個靜態(tài)類,里面專門定義用來控制條件編譯的變量。然后再在具體的代碼中導(dǎo)入該類,使用這些final變量。代碼如下:

        60. public class DebugConfig { 
        61.     public static final boolean BLUETOOTH_DEBUG = false
        62.     public static final boolean WIRELESS_DEBUG = false
        63. }
        64. if ( DebugConfig.BLUETOOTH_DEBUG) { 
        65.     // TODO 
        66. }
        67. posted on 2011-12-07 11:25 順其自然EVO 閱讀(174) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2011年12月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 仁化县| 兴安县| 齐河县| 和龙市| 阜阳市| 庆阳市| 平邑县| 隆德县| 岳池县| 青铜峡市| 四子王旗| 聊城市| 全椒县| 敦煌市| 霞浦县| 泰和县| 龙游县| 右玉县| 翼城县| 丹凤县| 沙坪坝区| 根河市| 城市| 边坝县| 宜城市| 吉水县| 岚皋县| 宜丰县| 凯里市| 泉州市| 沙湾县| 金山区| 合江县| 凤翔县| 永安市| 石狮市| 聊城市| 高台县| 库车县| 莎车县| 安康市|