推荐使用枚举注解

推荐使用@IntDef和@StringDef来代替枚举类。

Enum概述

缺点

  • 每个枚举类都是一个对象,在使用它的时候会增加额外的内存消耗,所以枚举比Integer和String会占用更多内存
  • 较多的使用Enum会增加DEX文件的大小,会造成运行时更多的开销
  • 当然,也会增加apk包的大小

使用场景

如果我们需要定义一些固定的几种类型,比如说星期1到星期7,比如说定义几种状态等等

方案一使用枚举时
1
2
3
public static enum Sex {
MAN, WOMEN
}
方案二使用常量
1
2
3
4
5
private final int MAN = 101, WOMEN = 102;

public void setSex(int sex){
this.sex = sex;
}
两种形式比较

这两种情况使用都比较常见,枚举的缺点刚才也列举了,就是占用内存较大,那么方案二使用普通的常量呢,这种形式的缺点主要是比较零散,再一个就是方法参数不好约束;所以我们推荐使用第三种形式。

@IntDef和@StringDef

1
compilecom.android.support:support-annotations:24.2.0

使用例子:

1
2
3
4
5
6
7
8
@IntDef({STATE_NORMAL, STATE_LOADING, STATE_EMPTY, STATE_ERROR})
@Retention(RetentionPolicy.SOURCE)
public @interface LoadState {
int STATE_NORMAL = 101;//正常数据
int STATE_LOADING = 102;//局部加载圈
int STATE_EMPTY = 103;//数据为空
int STATE_ERROR = 104;//加载失败
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void showNetRefreshState(@LoadState int state) {
switch (state) {
case LoadState.STATE_NORMAL:
mVaryViewHelper.showDataView();
break;
case LoadState.STATE_LOADING:
mVaryViewHelper.showLoadingView();
break;
case LoadState.STATE_EMPTY:
mVaryViewHelper.showEmptyView();
break;
case LoadState.STATE_ERROR:
mVaryViewHelper.showErrorView();
break;
}
}
  • 这样可以将某一类状态归纳一起
  • 限制方法传参
  • 使用常量的形式,内存要远小于使用Enum

补充内容

注解的生命周期

@Retention(RetentionPolicy.SOURCE)

  • RetentionPolicy.SOURCE 源码注解,编译成.class文件后注解就不存在,用来提示开发者
  • RetentionPolicy.CLASS CLASS汇编注解,编译成.class文件后注解也还存在,用于自动生成代码
  • RetentionPolicy.RUNTIME 运行时动态注解,生命周期一直程序运行时都存在,常用于自动注入
文章目录
  1. 1. Enum概述
    1. 1.1. 缺点
    2. 1.2. 使用场景
      1. 1.2.1. 方案一使用枚举时
      2. 1.2.2. 方案二使用常量
      3. 1.2.3. 两种形式比较
    3. 1.3. @IntDef和@StringDef
    4. 1.4. 补充内容