上善若水
          In general the OO style is to use a lot of little objects with a lot of little methods that give us a lot of plug points for overriding and variation. To do is to be -Nietzsche, To bei is to do -Kant, Do be do be do -Sinatra
          posts - 146,comments - 147,trackbacks - 0

          首先來比較兩段代碼所產生的中間代碼:

           public class AppConfig {

              public static final boolean debug = true;
          }
          public class DebugCode {
              
          public static void main(String[] args) {
                 
          if(AppConfig.debug) {
                     System.out.println(
          "Some debug information");
                 }
              }
          }

          DebugCode的中間代碼(部分):

          public class org.levin.insidejvm.miscs.DebugCode {

           public static void main(java.lang.String[] args);

              0 getstatic java.lang.System.out : java.io.PrintStream [16]

              3 ldc <String "Some debug information"> [22]

              5 invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]

              8 return

          }

           

          public class AppConfig {
              
          public static final boolean debug = false;
          }
          public class ReleaseCode {
              
          public static void main(String[] args) {
                 
          if(AppConfig.debug) {
                     System.out.println(
          "Some debug information");
                 }
              }
          }

           

           

          ReleaseCode中間代碼(部分):

          public class org.levin.insidejvm.miscs.ReleaseCode {

           public static void main(java.lang.String[] args);

              0 return

          }

           

          在上面的代碼中,很明顯DebugCodeReleaseCode中的代碼是一樣的,只是AppConfig.debug的值不一樣而已,卻產生了不同的中間代碼,即編譯器在AppConfig.debugfalse的時候直接忽略了if中的語句。利用這個特性,我們就可以根據配置來實現條件編譯,從而實現不同的條件產生不同的中間代碼而不只是不同的運行結果。

           

          然而在這里為什么會出現這樣的行為呢?

          這是因為編譯器對final修飾的基本類型和String類型的變量,在編譯時解析為一個本地拷貝,這樣拷貝導致編譯器在編譯的時候明確的知道ReleaseCode的那一段if語句是不會被執行的,因而可以對其做優化。而這種替換的結果也使得用final修飾的int變量可以出現在switch-case語句中。

           

          這種方式的缺陷

          這種方式的缺陷在于要現實該機制的條件編譯,在改變AppConfig.debug中的值時,需要同時對AppConfig類和ReleaseCode類進行編譯(即不能只編譯AppConfig類)。

           

          參考:《深入Java虛擬機(第二版)》第八章
          2010-09-22

          posted on 2011-07-20 00:23 DLevin 閱讀(1753) 評論(0)  編輯  收藏 所屬分類: Core Java
          主站蜘蛛池模板: 新闻| 东阿县| 宜君县| 莫力| 仪陇县| 历史| 新巴尔虎右旗| 英吉沙县| 招远市| 江西省| 万安县| 方城县| 霍山县| 长岭县| 福建省| 保定市| 区。| 沙坪坝区| 沁阳市| 扎鲁特旗| 黎城县| 裕民县| 遵义县| 东台市| 镶黄旗| 建水县| 怀仁县| 宜城市| 香港 | 彭水| 和林格尔县| 保亭| 昌江| 寿阳县| 临漳县| 抚顺市| 安国市| 交城县| 湖口县| 溧阳市| 内丘县|