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
注解保留在程序运行期间,此时可以通过反射获得定义在某个类上的所有注解。