Java допускает enum
в качестве значений для значений аннотации. Как я могу определить какое-то общее значение по умолчанию enum
для значения аннотации enum
?
Я рассмотрел следующее, но оно не компилируется:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public <T extends Enum<T>> @interface MyAnnotation<T> {
T defaultValue();
}
Есть ли решение этой проблемы или нет?
BOUNTY
Кажется, нет прямого решения этого углового случая Java. Итак, я начинаю щедрость, чтобы найти наиболее элегантное решение этой проблемы.
Идеальное решение должно в идеале соответствовать следующим критериям:
НАИЛУЧШЕЕ РЕШЕНИЕ НА ТАКОЕ ДАЛЬШЕ
Автор Dunes:
@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
в полях для предоставленного значения по умолчанию.
Это требует создания одного типа аннотации для каждого типа перечисления, но гарантирует безопасность типа с проверкой времени компиляции.