Android之使用枚舉利弊及替代方案


Android上不應該使用枚舉,占內存,應該使用@XXXDef注解來替代

使用 Enum 的缺點

每一個枚舉值都是一個對象,在使用它時會增加額外的內存消耗,所以枚舉相比與 Integer 和 String 會占用更多的內存。

較多的使用 Enum 會增加 DEX 文件的大小,會造成運行時更多的開銷,使我們的應用需要更多的空間。

如果你的應用使用很多的 Enum ,最好使用Integer 或 String 替代他們,但是這樣還會有問題。

既然都說到這個份上了,那么有什么比較好的解決方法呢?

 1 public class SexTest{
 2 
 3     public static enum Sex {
 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會直接報錯:

 
 


免責聲明!

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



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