在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() 得到业务逻辑所须要的值
//此处是你的业务逻辑
}
});复制代码