枚举最大的作用是提供了类型安全。为了弥补Android平台不建议使用枚举的缺陷,官方推出了两个注解,IntDef和StringDef,用来提供编译期的类型检查。
首先,引入依赖包:
compile 'com.android.support:support-annotations:22.0.0'
public class MyConstants {
public static final int STATE_ONE = 1;
public static final int STATE_TWO = 2;
public static final int STATE_THREE = 3;
// 自定义一个注解MyState
@IntDef({STATE_ONE, STATE_TWO, STATE_THREE})
public @interface MyState {}
}
如果我们定义一个状态变量:
@MyConstants.MyState
private int state;
上面的state变量被注解修饰,这样就限制了上面变量的值只能为注解里面定义的三种类型。
另外,如果我们定义的方法传入的变量也被这个注解修饰,这样就限制了我们传入参数的值只能为注解的几种类型。
private void setState(@MyConstants.MyState int state) {
//some code
}
当调用方法时只能使用STATE_ONE,STATE_TWO和STATE_THREE。使用其他值会导致编译提醒和警告。
但是需要说明的是这仅仅是AS的静态代码检查而已,就像上面的代码,尽管IDE已经报错,你还是可以直接Run Application,而且也可以成功运行。它只是为了在程序员写代码的时候可以提醒程序员应该注意这个地方可能出错。