巧用枚舉來處理UI中顯示值與業務值不一樣的場景

在Android中,常常會遇到一些在UI上顯示的值與實際業務須要的值不一致的場景,這時就是枚舉發揮用武之地的時候了javascript

看下圖所示的這個場景:


java

這個場景是一個相似於web中<select>的場景(圖中這個下拉組件是我本身寫的一個自定義View,用於替換SDK內置的Spinner),從這個場景中不難看出,咱們在UI中須要顯示的值和業務邏輯中須要的值是不同的(後端給的接口定義了一組數字來做爲參數),咱們不能直接把UI中的「正面」這兩個字做爲參數傳給業務邏輯的方法,而應傳遞一個對應於「正面」的值,該如何實現這個場景呢,這時候枚舉就該登場了web

Talk is cheap. Show me the code.後端

//代碼片斷1
public enum Relativity {

    //直接使用中文來給枚舉命名,從而利用繼承自父類的 .toString() 來返回UI須要的值
    所有 {
        @Override
        public String value() {
            return "";
        }

    }, 正面 {
        @Override
        public String value() {
            return "1";
        }

    }, 中性 {
        @Override
        public String value() {
            return "0";
        }

    }, 負面 {
        @Override
        public String value() {
            return "-1";
        }

    };

    public abstract String value(); //定義一個抽象方法讓子類來實現,這個方法的返回值是業務邏輯中須要用到的值
}複製代碼
//代碼片斷2 (這個 bindData 是我自定義View裏的綁定數據的方法,實際上裏面是調用了ArrayAdapter的addAll(T... items))
spinnerRelativity.bindData(Relativity.values()); //直接使用枚舉的 .values() 返回全部此類枚舉所組成的數組做爲參數傳給UI複製代碼
//代碼片斷3 
spinnerRelativity.setOnValueChangeListener(new OnValueChangeListener() {

    @Override
    public void onValueChange(View view, CharSequence originalValue, CharSequence newValue) {
        relativity = Relativity.valueOf((String) newValue) //onValueChange 是我自定義View裏的一個回調方法,如圖所示,當用戶選中「所有」時方法的第二個CharSequence參數「newValue」的值就是一個字符串 "所有", 這時,利用枚舉的 valueOf(String s) 方法就能夠從這個字符串獲得對應的枚舉對象
                .value(); //獲得枚舉對象後再調用枚舉中自定義的 .value() 得到業務邏輯所須要的值

                //此處是你的業務邏輯
    }
});複製代碼
相關文章
相關標籤/搜索