IntDef 和 StringDef 的使用

时间:2025-02-08 12:15:23

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");     //会被标记
}