Android中使用注解来代替枚举类的方式

来源:互联网 发布:yum配置文件 编辑:程序博客网 时间:2024/05/19 12:29
记得我刚开始写代码的时候,在一些场景中还不会利用枚举类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枚举类的话,还是赶紧改成注解的形式吧。

1 0
原创粉丝点击