2015年6月13日 星期六

Android 開發(一百零二) 利用annotation 處理 enum

在java 中我們常常會使用enum處理多種type,不過android 官方說這種寫法是非常expensive (可能是效率或memory其實我沒有多做研究)所以官方推薦我們利用另外一種寫法,使用annotation來處理

先讓我們看一下下面的程式碼

public class MyMode {
    @IntDef({SUCCESS, NETWORK_FAIL, DATA_ERROR})
    @Retention(RetentionPolicy.SOURCE)
    public @interface APIMode {}

    public static final int SUCCESS = 0;
    public static final int NETWORK_FAIL = 1;
    public static final int DATA_ERROR = 2;

    private int mode = SUCCESS;
    public int getMode(){
        return mode;
    }

    public void setMode(@ APIMode int _mode){
        mode = _mode;
    }

}

我定義了一個MyMode 並且定義了
SUCCESS = 0
NETWORK_FAIL = 1
DATA_ERROR = 2

接著我利用了
@IntDef({SUCCESS, NETWORK_FAIL, DATA_ERROR})
    @Retention(RetentionPolicy.SOURCE)
    public @interface APIMode {}

定義了一個自定義的annotation APIMode 而這個annotation只有在setMode的時候會被用到,這個annotation有什麼功用呢?

主要是在寫程式的時候,我們常常會這樣寫 mymode.setMode(1);
這樣寫程式是可以work的,但是其實很不好讀,對於其他的developer他們還必須進來查看才知道原來setMode(1)是在說 NETWORK_FAIL ,
所以我們該如何避免developer為了方便,而使用這種寫法呢?

我們使用了剛剛的annotation時,如果有人寫同樣的code,我們就可以在android studio上面看到如下圖的提示

而且數字下方會有紅字顯示,這樣developer就比較會去修改它,可惜的是,這種寫法似乎沒有辦法強制build不過(或許使用lint就行)

最後,我覺得這種寫法的確是蠻不錯的,but對於實際在使用上面,感覺大部份的人還是會為了方便而使用enum,不過官方都這麼推薦了,還是可以考慮用看看囉~

沒有留言:

張貼留言