Типизированное перечисление в Java - PullRequest
3 голосов
/ 04 августа 2010

Не уверен, что название вводит в заблуждение, но требование ниже.

Мне нужно использовать строковое значение в качестве ввода для пользовательской аннотации. При использовании значения enum среда IDE выдает

Значение атрибута java должно быть постоянным.

@test("test") // works

@test(Const.myEnum.test.toString()) //java attribute value must be constant

Я читал о важности неизменности строкового значения. Возможно ли достичь через enum (не публичный статический финальный взлом String).

спасибо.

Ответы [ 5 ]

6 голосов
/ 04 августа 2010

Перечисления могут использоваться в аннотациях. Вы должны сделать это так:

@test(Const.myEnum.test)

при условии, что вы определили перечисление следующим образом:

package Const;

public enum myEnum {
    test;
}

и такая аннотация:

public @interface test {
    myEnum value();
}
3 голосов
/ 04 августа 2010

При использовании enum не должно быть никаких проблем, возможно, проблема в том, как вы это объявляете, или в аннотации. Вот пример, который компилируется без проблем.

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface MyAnnotation {

    MyEnum value();

    public enum MyEnum {
        ONE, TWO, THREE, FOUR
    }
}

public class AnnotationTest {

    @MyAnnotation(MyEnum.ONE)
    public void someMethod() {
        //...
    }

}
1 голос
/ 04 августа 2010

Если аннотация находится под вашим контролем, задайте тип атрибута enum вместо String. В противном случае это невозможно.

Кроме того, аннотация, как и каждый класс Java, должна начинаться с заглавной буквы (т.е. Test, а не test):

// retention, target here
public @interface Test {
    YourEnum value();
}
0 голосов
/ 04 августа 2010

Параметр не должен быть результатом метода, т.е. toString ()

Но вы должны быть в состоянии использовать константы перечисления.

0 голосов
/ 04 августа 2010

Если вы хотите, чтобы параметр аннотации был ограничен значениями типа enum, присвойте этот тип параметру, а не String. Тип enum является типом enum, и нет никакого способа обойти тот факт, что вызов toString не является «константным» преобразованием.

...