美文网首页
Android @IntDef 替代 Enum

Android @IntDef 替代 Enum

作者: 大_川 | 来源:发表于2017-04-27 15:19 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/litnzttx.html