在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() 得到業務邏輯所須要的值
//此處是你的業務邏輯
}
});複製代碼