qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          從思路開始 Java如何實現條件編譯

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

        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中卻沒有預處理,宏定義這些東西,而有時在一些項目中,我們又需要條件編譯。那么,在JAVA中,該如何實現條件編譯呢?

            我們來看一個例子。

            編寫一個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字節。然后我們對這個文件進行反編譯,用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.   得到這個有什么用呢?

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

        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字節。怎樣?想到什么了吧?沒錯,編譯器會對代碼進行優化,對于條件永遠為false的語句,JAVA編譯器將不會對其生成字節碼。下面我們再來對該class文件進行反編譯,果然代碼如下:

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


        42.  利用JAVA編譯的這一優化機制,我們就可以實現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.   當條件編譯使用得多時,上面將極不利于代碼的修改及維護,這時就可以用一種更為靈活的方法。定義一個靜態類,里面專門定義用來控制條件編譯的變量。然后再在具體的代碼中導入該類,使用這些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 閱讀(173) 評論(0)  編輯  收藏


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


          網站導航:
           
          <2011年12月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 涟源市| 稷山县| 榆林市| 广州市| 岳西县| 伊春市| 陕西省| 梁河县| 九龙坡区| 科技| 岳西县| 花垣县| 大关县| 永顺县| 呈贡县| 双柏县| 屯门区| 娱乐| 福泉市| 喜德县| 钟祥市| 治县。| 阳山县| 广丰县| 浦江县| 磴口县| 洞头县| 卢龙县| 聂荣县| 大冶市| 精河县| 罗田县| 西藏| 德庆县| 晋中市| 惠来县| 会泽县| SHOW| 溧阳市| 枝江市| 乐清市|