在上一篇文章《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
15public interface SignInProgress {
/**
* 登录进行中
*/
int START = 0;
/**
* 登录成功
*/
int SUCCESS = 1;
/**
* 登录失败
*/
int FAILURE = -1;
}
2. 编写注解类型
1 | //限定Annotation所饰的对象为方法参数 |
3. 使用注解
1 | void updateSignInState(@SignInState int state) { |
switch-case中必须使用SignInProgress接口中定义的常量值,否则将会出现如下警告:1
Don't use a constant here; expected one of: SignInProgress.FAILURE, SignInProgress.START, SignInProgress.SUCCESS