Android之使用枚舉利弊及替代方案
Android上不應該使用枚舉,占記憶體,應該使用@XXXDef註解來替代。
使用 Enum 的缺點
每一個枚舉值都是一個對象,在使用它時會增加額外的記憶體消耗,所以枚舉相比與 Integer 和 String 會佔用更多的記憶體。
較多的使用 Enum 會增加 DEX 檔案的大小,會造成運行時更多的開銷,使我們的應用需要更多的空間。
如果你的應用使用很多的 Enum ,最好使用Integer 或 String 替代他們,但是這樣還會有問題。
既然都說到這個份上了,那麼有什麼比較好的解決方案呢?
public class SexTest{
public static enum Sex {
MAN, WOMEN
}
private Sex sex;
//設定性別
public void setSex(Sex sex){
this.sex = sex;
}
//擷取性別
public String getSex(){
if(Sex.MAN == sex) return "男";
if(Sex.WOMEN == sex) return "女";
return "未知";
}
public static void main(String[] args){
//這裡的入參必須為Sex枚舉類中的其中一個枚舉常量
//絕對不允許輸入沒有再Sex枚舉裡面定義的常量
setSex(Sex.MAN);
String resultSex = getSex();
System.out.println("resultSex: " + resultSex);
//輸出:resultSex: 男
}
}
解決方案
既然是因為參數的類型太泛了造成的類型不安全,那麼我只要將參數限定在某一個類型集合裡面,不就大功告成了?!
是滴,一下就是要將的@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會直接報錯:
https://www.bkjia.com/topicnews.aspx?tid=5
本文永久更新連結地址:https://www.bkjia.com/Linux/2018-02/151004.htm