為什么 Android 中不建議使用 Enums

jopen 9年前發布 | 9K 次閱讀 Android Android開發 移動開發

 

關于Android性能優化中一個常見的建議是不要在你的代碼中使用Enums,就連 Android官網 上都強烈建議不要使用。

為什么 Android 中不建議使用 Enums

Why

Android中當你的App啟動后系統會給App單獨分配一塊內存。App的DEX code、Heap以及運行時的內存分配都會在這塊內存中。接下來看兩種寫法:

  • 1.使用Int表示狀態
  • </ul> </span>
    public static final int VALUE1 =1;
    public static final int VALUE1 =2;
    public static final int VALUE1 =3;

    2.使用Enums表示狀態
    public static enum Value{
      VALUE1,
      VALUE2,
      VALUE3
    }

    情形2中的DEX size增加是情形1中的13倍之多。這還只是DEX code的增加,同樣,運行時的內存分配,一個enum值的聲明會消耗至少20 bytes,這還不算其中的對象數組需要保持對enum值的引用。Why?使用javap反編譯情形二中生成的class文件,去掉匯編代碼后如下:
    public final class VALUE extends java.lang.Enum{  
      public static final VALUE VALUE1;  
      public static final VALUE VALUE2;  
      public static final VALUE VALUE3;
      private static final VALUE[] values[];
      static{}
    }

    可以看到實際上enum類型繼承java.lang.Enum,每個枚舉項都會被聲明成一個靜態變量,并被賦值。VALUE value1 = VALUE.VALUE1則會引起對靜態變量的引用。

    因 此,當你的代碼或包含的Lib中大量使用enums時,對于本身內存小的手機將是災難性的。不可否認enums會使得代碼更易讀更安全,但是我們使用 Int也可以通過@IntDef 注解防止編譯時Lint errors。當然如果你使用enums,proguard在一些情況下會優化你的代碼使用Int代替。

    </span>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!