推荐使用@IntDef和@StringDef来代替枚举类。
Enum概述
缺点
- 每个枚举类都是一个对象,在使用它的时候会增加额外的内存消耗,所以枚举比Integer和String会占用更多内存
- 较多的使用Enum会增加DEX文件的大小,会造成运行时更多的开销
- 当然,也会增加apk包的大小
使用场景
如果我们需要定义一些固定的几种类型,比如说星期1到星期7,比如说定义几种状态等等
方案一使用枚举时
1 | public static enum Sex { |
方案二使用常量
1 | private final int MAN = 101, WOMEN = 102; |
两种形式比较
这两种情况使用都比较常见,枚举的缺点刚才也列举了,就是占用内存较大,那么方案二使用普通的常量呢,这种形式的缺点主要是比较零散,再一个就是方法参数不好约束;所以我们推荐使用第三种形式。
@IntDef和@StringDef
1 | compile ‘com.android.support:support-annotations:24.2.0’ |
使用例子:
1 | ({STATE_NORMAL, STATE_LOADING, STATE_EMPTY, STATE_ERROR}) |
1 | public void showNetRefreshState( int state) { |
- 这样可以将某一类状态归纳一起
- 限制方法传参
- 使用常量的形式,内存要远小于使用Enum
补充内容
注解的生命周期
@Retention(RetentionPolicy.SOURCE)
- RetentionPolicy.SOURCE 源码注解,编译成.class文件后注解就不存在,用来提示开发者
- RetentionPolicy.CLASS CLASS汇编注解,编译成.class文件后注解也还存在,用于自动生成代码
- RetentionPolicy.RUNTIME 运行时动态注解,生命周期一直程序运行时都存在,常用于自动注入