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