IntDef 和 StringDef 的使用
在 中提供了 IntDef 和 StringDef 两个元注解供使用。
在如下的应用场景中可以进行使用:需要传入的参数是几个固定值(整形、字符串)中的某一个时,可以使用这两个注解来帮助你在编译时判断参数是否传错。如果不使用注解,常见的做法是使用枚举类。
例如有一个设置星期的函数
private void setCurrentDay(int day) {
currentDay = day;
}
配套一个枚举类来进行使用。
private enum Day {
MONDAY(1), TUESDAY(2);
private int day;
private Day(int day) {
this.day = day;
}
public int getDay() {
return day;
}
}
然后调用 setCurrentDay 方法
setCurrentDay(Day.MONDAY.getDay());
IntDef 的使用
IntDef 表示带注释的整数类型的元素表示逻辑类型,并且其值应为明确命名的常量之一。先预设几个常量:
private static final int MONDAY = 1;
private static final int TUESDAY = 2;
然后手写自己的注解,作用在 PARAMETER 和 FIELD 上。
@IntDef({MONDAY, TUESDAY})
@Target({ElementType.PARAMETER, ElementType.FIELD})
@interface MyDay {
}
然后用自己写的注释去修饰需要使用的变量和函数
@MyDay
private int currentDay;
private void setCurrentDay(@MyDay int day) {
currentDay = day;
}
最后在调用 setCurrentDay 方法时,传入的参数会被自动限定为 MONDAY 或者 TUESDAY,其他的 int 型数字比如 1 会被 IDE 标记(但是不报错)。
private void test() {
setCurrentDay(MONDAY);
setCurrentDay(1); //被标记
}
StringDef 的使用
和 IntDef 类似,这里直接给出相关的代码,不再做具体说明
private static final String JANUARY = "January";
private static final String FEBRUARY = "February";
@StringDef({JANUARY, FEBRUARY})
@Target({ElementType.PARAMETER, ElementType.FIELD})
@interface MyMonth {
}
private void setCurrentMonth(@MyMonth String month) {
currentMonth = month;
}
private void test() {
setCurrentMonth(JANUARY);
setCurrentMonth("JANUARY"); //会被标记
}