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

來源:互聯網
上載者:User

標籤:就是   auto   prot   protect   圖片   layout   檔案的   public   提示   

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;@Overrideprotected 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之使用枚舉利弊及替代方案

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.