Android之使用枚舉利弊及替代方案
阿新 • • 發佈:2018-02-13
xxd result out idt image png eat find oid
Android上不應該使用枚舉,占內存,應該使用@XXXDef註解來替代
使用 Enum 的缺點
每一個枚舉值都是一個對象,在使用它時會增加額外的內存消耗,所以枚舉相比與 Integer 和 String 會占用更多的內存。
較多的使用 Enum 會增加 DEX 文件的大小,會造成運行時更多的開銷,使我們的應用需要更多的空間。
如果你的應用使用很多的 Enum ,最好使用Integer 或 String 替代他們,但是這樣還會有問題。
既然都說到這個份上了,那麽有什麽比較好的解決方法呢?
1 public class SexTest{ 2 3 public static enumSex { 4 MAN, WOMEN 5 } 6 7 private Sex sex; 8 //設置性別 9 public void setSex(Sex sex){ 10 this.sex = sex; 11 } 12 13 //獲取性別 14 public String getSex(){ 15 if(Sex.MAN == sex) return "男"; 16 if(Sex.WOMEN == sex) return "女"; 17 return "未知"; 18 } 19 20 public static void main(String[] args){ 21 //這裏的入參必須為Sex枚舉類中的其中一個枚舉常量 22 //絕對不允許輸入沒有再Sex枚舉裏面定義的常量 23 setSex(Sex.MAN); 24 String resultSex = getSex(); 25 System.out.println("resultSex: " + resultSex); 26 //輸出:resultSex: 男 27 } 28 }
解決方案
既然是因為參數的類型太泛了造成的類型不安全,那麽我只要將參數限定在某一個類型集合裏面,不就大功告成了?!
是滴,一下就是要將的@IntDef/@StringDef + @interface來進行限定參數。
首先你要在build.gradle文件中添加依賴
dependencies { compile ‘com.android.support:support-annotations:24.2.0’ }
然後再使用,代碼如下:
public class MainActivity extends Activity { public static final int MALE = 0; public static final int FEMALE = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); Person person = new Person(); person.setSex(MALE); ((Button) findViewById(R.id.test)).setText(person.getSexDes()); } class Person { @SEX private int sex; public void setSex(@SEX int sex) { this.sex = sex; } @SEX public int getSex() { return sex; } public String getSexDes() { if (sex == MALE) { return "男"; } else { return "女"; } } } @IntDef({MALE, FEMALE}) @Retention(RetentionPolicy.SOURCE) public @interface SEX { } }
如果我們嘗試在調用setSex()方法的時候,傳入不在限定之內的值,那麽編譯就不會通過,有錯誤提示。同理,我們也可以使用@StringDef。
這裏我們可以看到,@SEX
註解可以放到屬性定義,參數,返回值等地方對數據類型進行限制。如果我們直接賦值一個Int
參數給setSex()
,IDE會直接報錯:
Android之使用枚舉利弊及替代方案