Android中是否推薦使用枚舉Enum


一、Enum的產生

Java1.5中引入了枚舉的語法,包括Enum,EnumSet,EnumMap等。其中Enum就是我們在C或C++中見過的枚舉類型,但是Java中的枚舉又比C或C++中的枚舉更成熟和復雜。在Java中,枚舉算是一種特殊的類,也就是class,因此它可以做很多類相關的事情,而不僅僅是定義幾個枚舉值

 二、Android官方建議

Android官網不建議使用enums,占用內存多(Enums often require more than twice as much memory as static constants.)。 Android中當你的App啟動后系統會給App單獨分配一塊內存。App的DEX code、Heap以及運行時的內存分配都會在這塊內存中。
比如:
1.使用Int表示狀態 public static final int VALUE1 =1; public static final int VALUE2 =2; public static final int VALUE3 =3;
2.使用Enums表示狀態 public static enum Value{ VALUE1, VALUE2, VALUE3 }

2中使用Enums,DEX size增加是情形1中的13倍之多。這只是DEX code的增加,同樣,運行時的內存分配,一個enum值的聲明會消耗至少20 bytes,不算其中的對象數組需要保持對enum值的引用。使用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則會引起對靜態變量的引用。

三、Android 中的 Enum 到底占多少內存?該如何用?

 

 

四、替代方案

個人傾向與接口變量,因為接口會自動將成員變量設置為靜態的(static)、不可變的(final),這一點可以防止某些情況下錯誤地添加新的常量。這也使得代碼看起來更簡單和清晰。 同時,一個的簡單測試顯示,同樣的接口(字節碼文件)占用的空間是209個字節左右,而類(字節碼文件)占用的空間是366個字節左右。更少的字節碼文件意味着加載和維護的成本更低。此外,JVM 加載接口的時候,不需要擔心類提供的額外特征(如重載、方法的動態綁定等),因此加載更快。

五、總結

不可否認enums會使得代碼更易讀更安全,但是在編寫高效Android代碼時避免使用枚舉,我們在很多經典的Java書已經看到推薦使用枚舉來代替int常量了,但是在Android開發中我不建議使用枚舉,特別是大型的App中,能不用則不用。因為它會犧牲執行的速度和並大幅增加文件體積。這也是性能優化中減少OOM的一個方面。
例如: public class Foo { public enum Shrubbery { GROUND, CRAWLING, HANGING } } 會產生一個900字節的.class文件(Foo$Shubbery.class)。在它被首次調用時,這個類會調用初始化方法來准備每個枚舉變量。每個枚舉項都會被聲明成一個靜態變量,並被賦值。然后將這些靜態變量放在一個名為"$VALUES"的靜態數組變量中。而這么一大堆代碼,僅僅是為了使用三個整數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM