Java позволяет использовать enum
в качестве значений для значений аннотаций. Как я могу определить тип общего значения по умолчанию enum
для значения аннотации enum
?
Я рассмотрел следующее, но он не будет компилироваться:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public <T extends Enum<T>> @interface MyAnnotation<T> {
T defaultValue();
}
Есть решение этой проблемы или нет?
ПОДАРОК
Не похоже, что есть прямое решение для этого углового случая Java. Итак, я запускаю щедрость, чтобы найти самое элегантное решение этой проблемы.
идеальное решение должно идеально соответствовать следующим критериям:
- Одна аннотация, которую можно использовать повторно во всех перечислениях
- Минимальные усилия/сложность для получения значения перечисления по умолчанию в виде перечисления из экземпляров аннотаций.
САМОЕ ЛУЧШЕЕ РЕШЕНИЕ
По дюнам:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyAnnotation {
// By not specifying default,
// we force the user to specify values
Class<? extends Enum<?>> enumClazz();
String defaultValue();
}
...
public enum MyEnumType {
A, B, D, Q;
}
...
// Usage
@MyAnnotation(enumClazz=MyEnumType.class, defaultValue="A");
private MyEnumType myEnumField;
Конечно, мы не можем заставить пользователя указать действительное значение по умолчанию во время компиляции. Однако любая предварительная обработка аннотации может проверить это с помощью valueOf()
.
УЛУЧШЕНИЕ
Arian предлагает элегантное решение, позволяющее избавиться от clazz
в аннотированных полях:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyAnnotation {
}
...
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@MyAnnotation()
public @interface MyEnumAnnotation {
MyEnumType value(); // no default has user define default value
}
...
@MyEnumAnnotation(MyEnum.FOO)
private MyEnumType myValue;
Обработчик аннотаций должен искать оба поля MyEnumAnnotation
для предоставленного значения по умолчанию.
Это требует создания одного типа аннотации для каждого типа перечисления, но гарантирует безопасность типов, проверенных во время компиляции.
private MyEnum field = MyEnum.DEFAULT;
? - person Alistair A. Israel   schedule 16.08.2011private MyEnum field1 = MyEnum.VALUE1;
, а затемprivate MyEnum field2 = MyEnum.VALUE2;
. Я до сих пор не понимаю, что аннотация приносит на стол. - person Alistair A. Israel   schedule 16.08.2011