记得我刚开始写代码的时候,在一些场景中还不会利用枚举类enum ,会经常用数字太代替,比如:
switch (type) {
case 1:
//1代表。。。。。
fun1();
break;
case 2:
//2代表。。。。。
fun2();
break;
case 3:
//3代表。。。。。
fun3();
break;
default:
break;
}
虽然也加了注释,但是这样看起来还是赶紧很 low,因为在代码里突然出现这种“神奇数字“,一看就是新手。
有同学说,那我在这个类里加几个
**public static final**
的常量来区分type ,不就好管理,好辨认了吗,在有些情况下,比如这几个常量之间没有什么关系,也不用于辨别一个类型,那这样做确实没什么问题,
但是遇到类似上面的情况,数字1 ,2 ,3都是用于辨别type时,有同学会这样来用:
public static final String HOTEL = 1;
public static final String FLIGHT = 2;
public static final String TRAIN = 3;
如果就只有简单的几个类型,用在类里定义**public static final** 的形式就还是没什么问题,但是如果比较多的时候,就显得有点low了,
然后一些同学会说,那就使用enum类来统一管理呗,
public enum EnumTest {
HOTEL,
FLIGHT,
TRAIN,
...
}
在java开发中,虽然推荐使用枚举类替代一些int常量,但是在android中,官方还是不建议使用枚举类的:
Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.
由官网的描述可知,枚举类还是很耗费内存的,所以更加优雅的方式应该是使用注解的形式,
如下所示:
1 先定义一个类 ,里面定义好各种枚举类型,这里我用是在一个类里定义的一个内部类
static class FilterTypeManager {
static final int Type_Star = 1;
static final int Type_Price = 2;
static final int Type_Facility = 3;
static final int Type_PayType = 4;
static final int Type_POI = 5;
}
2 然后使用注解的形式,如下代码所示:
@IntDef({FilterTypeManager.Type_Star,
FilterTypeManager.Type_Price,
FilterTypeManager.Type_Facility,
FilterTypeManager.Type_POI,
FilterTypeManager.Type_Brand,
FilterTypeManager.Type_Promo,
FilterTypeManager.Type_FreeCancel,
FilterTypeManager.Type_Bookable,
FilterTypeManager.Type_Distance})
@Retention(RetentionPolicy.SOURCE)
@interface FilterType {
}
前提是你已经倒入了注解的包:
compile ‘com.android.support:support-annotations:24.0.0’
3 使用的时候,就用下面的形式:
switch (type) {
case FilterType.Type_Star:
do something;
break;
case FilterType.Type_Price:
do something;
break;
.
.
.
}
由于我们上面注解声明的是RetentionPolicy.SOURCE,所以好处是,编译器代码检查工具能识别出来错误引用的地方,
我们可以在变量声明、函数返回值声明、函数参数声明前加上该注解,那么就可以限定相应的值,只能是我们注解中定义的枚举值,这样就可以避免一些错误。
@FilterType
private int type;
@FilterType
public int getType(){
return type;
}
public void setType(@FilterType int type){
this.type = type;
}
其实android中关于View的setVisibility(),其中View,VISIBLE, View.GONE ,View.INVISIBILE 也是类似这样处理的。
ok ,如果你的android项目中还是在大量使用enum枚举类的话,还是赶紧改成注解的形式吧。