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
для заданного значения по умолчанию.
Это требует создания одного типа аннотации для каждого типа перечисления, но гарантирует безопасность проверенного типа во время компиляции.