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

记得我刚开始写代码的时候,在一些场景中还不会利用枚举类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枚举类的话,还是赶紧改成注解的形式吧。

猜你喜欢

转载自blog.csdn.net/unicorn97/article/details/71374477
今日推荐