Перечисления и аннотации

Я хочу использовать Аннотацию в безопасной от компиляции форме.

Для передачи значения () к Аннотации, я хочу использовать Строковое представление перечисления.

Существует ли способ использовать @A со значением от перечисления E?

public class T {

    public enum E {
        a,b;
    }

    // C1: i want this, but it won't compile
    @A(E.a)
    void bar() {

    // C2: no chance, it won't compile
    @A(E.a.toString())
    void bar2() {

    }
    // C3: this is ok
    @A("a"+"b")
    void bar3() {

    }

    // C4: is constant like C3, is'nt it ?
    @A(""+E.a)
    void bar4() {

    }
}

@interface A {
    String value();
}

Обновление

Мне нужен Строковый тип в @A.

Точка, я могу сделать это

@A("" + 1)
    void foo() {
}

Но здесь значение атрибута "требований компилятора должно быть постоянным". Постоянный Is'nt E.a?

@A("" + E.a)
    void foo() {
}
7
задан PeterMmm 27 March 2010 в 20:09
поделиться

2 ответа

Проблема в том, что вы умнее компилятора :-)

Ea - константа, но EatoString ( ) нет. Похоже, так и должно быть, но компилятор не может этого понять.

Причина, по которой работают "a" + "b" и "" + 1 , заключается в том, что компилятор достаточно умен, чтобы генерировать константы во время компиляции.

Когда он видит "" + E.a , он использует E.a.toString () . Вызова toString () достаточно, чтобы сбросить его.

Должно ли E быть перечислением? Вы можете попробовать:

public final class E {
  public static final String a = "a";
  public static final String b = "b";
};
10
ответ дан 6 December 2019 в 11:47
поделиться

Сделайте значение в аннотация типа E:

@interface A {
   E value();
}

Затем вы можете использовать

@A(E.a)
7
ответ дан 6 December 2019 в 11:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: