Annotation系列之源码级注解使用

  在上一篇文章《Annotation系列之基础篇》中,我们知道源码级注解(RetentionPolicy.SOURCE)在编译时会被忽略,通常用来在编写代码时进行错误检查、抑制警告以及变量值限制等。当然我们也可以自定义注解处理器(Annotation Processor),通过运行注解处理器收集注解信息并进行相应处理,不过一般自定义注解处理器用于配合编译时注解(RetentionPolicy.CLASS)使用,我们将在后面的文章中进行介绍,在这篇文章中主要介绍上一篇文章中提到的利用注解代替枚举类型(enum)的使用。

  在官网Manage Your App’s Memory文章中有提到

enums often require more than twice as much memory as static
constants. You should strictly avoid using enums on Android.

  网上也有不少关于Android开发中尽量避免使用枚举类型的讨论,比如
android开发之避免使用枚举》中提到的,枚举会增加dex文件大小,增加dex文件方法数量等一系列问题,因此如果能够通过使用注解来替代一般枚举类型的使用,我们又何乐而不为呢。

  在一些开发过程中,我们可能需要根据用户操作及数据请求结果进行不同的视图展示。以登录为例,用户点击登录按钮后,我们一般会显示一个进度条,同时进行数据登录验证,验证成功的话进入相应界面,失败则提示用户登录失败信息。

1. 定义状态常量

我们知道interface中的属性默认使用public final static修饰, 因此一般我们会将常量定义在interface中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public interface SignInProgress {
/**
* 登录进行中
*/
int START = 0;
/**
* 登录成功
*/
int SUCCESS = 1;
/**
* 登录失败
*/
int FAILURE = -1;

}

2. 编写注解类型

1
2
3
4
5
6
7
8
//限定Annotation所饰的对象为方法参数
@Target(ElementType.PARAMETER)
//限定注解的元素值
@IntDef({SignInProgress.START, SignInProgress.SUCCESS, SignInProgress.FAILURE})
//定义该Annotation为Source级
@Retention(RetentionPolicy.SOURCE)
public @interface SignInState {
}

3. 使用注解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void updateSignInState(@SignInState int state) {
switch (state) {
case SignInProgress.START:
//显示进度条
break;
case SignInProgress.SUCCESS:
//隐藏进度条,finish界面并进行登录成功跳转
break;
case SignInProgress.FAILURE:
//隐藏进度条,并进行登录异常提示
break;
default:
break;
}
}

switch-case中必须使用SignInProgress接口中定义的常量值,否则将会出现如下警告:

1
Don't use a constant here; expected one of: SignInProgress.FAILURE, SignInProgress.START, SignInProgress.SUCCESS

文章目录
  1. 1. 定义状态常量
  2. 2. 编写注解类型
  3. 3. 使用注解
|