Android @IntDef 替代 Enum

Enum 其本质就是一个特殊的Java类,有自己的构造器,成员变量,方法,同时也可以实现接口。Enum经过编译器编译后生成class文件,反编译class 文件生成一个final类,该类继承java.lang.Enum,所以enum是不能被继承的。

由于枚举的易用性与可读性都非常好,所以受广大开发者的推崇,但是也由于Enum的种种特性决定了它比较耗内存,所以谷歌也在内存管理的文档中说明应该避免使用enum(原文:enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android)。

在不建议使用enum的同时,Google也同时推出了替代方案 使用 ** @IntDef **注解来定义枚举,注解依赖库 compile'com.android.support:support-annotations:2x.x.x' 不废话,上代码:

public class EnmuIntDefDemo extends Fragment {

  //声明常量

  private static final int LEFT = 0;

  private static final int TOP = 1;

  private static final int RIGHT = 2;

  private static final int BOTTOM = 3;

  //声明构造器

  @IntDef({LEFT, TOP, RIGHT, BOTTOM})

  @Retention(RetentionPolicy.SOURCE)//声明所定义枚举的策略,有三种类型,后面细说。

  public @interface AlignParentSlid{}

  //用了声明变量

  @AlignParentSlid int mParentSlid;

  //声明参数

  public void setParentSlid(@AlignParentSlid int parentSlide){

  }

  //声明返回值

  @AlignParentSlid

  public int getParentSlid(){

  return LEFT;

  }

}

定义的枚举可以声明在变量,参数,返回值上,不多解释了,对声明的策略做一简单解析:

@Retention(RetentionPolicy.SOURCE)
共有三种策略:

RetentionPolicy.SOURCE
这种类型的Annotations只在源代码级别保留,编译时就会被忽略(什么意思?就是该策略下传值错误编译器会报错但是不影响运行)

RetentionPolicy.CLASS
注解保留在.class文件中,在加载到JVM虚拟机时丢弃(该策略下传值错误编译无法通过)

RetentionPolicy.RUNTIME
注解保留在程序运行期间,此时可以通过反射获得定义在某个类上的所有注解。

你可能感兴趣的:(Android @IntDef 替代 Enum)