Значение Enum по умолчанию для значения аннотации перечисления Java

Java допускает enum в качестве значений для значений аннотации. Как я могу определить какое-то общее значение по умолчанию enum для значения аннотации enum ?

Я рассмотрел следующее, но оно не компилируется:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public <T extends Enum<T>> @interface MyAnnotation<T> {

    T defaultValue();

}

Есть ли решение этой проблемы или нет?

BOUNTY

Кажется, нет прямого решения этого углового случая Java. Итак, я начинаю щедрость, чтобы найти наиболее элегантное решение этой проблемы.

Идеальное решение должно в идеале соответствовать следующим критериям:

  1. Одна аннотация, которую можно многократно использовать для всех enums
  2. Минимальные усилия / сложность для получения значения перечисления по умолчанию в виде перечисления из экземпляров аннотаций

НАИЛУЧШЕЕ РЕШЕНИЕ НА ТАКОЕ ДАЛЬШЕ

Автор 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 в полях для предоставленного значения по умолчанию.

Это требует создания одного типа аннотации для каждого типа перечисления, но гарантирует безопасность типа с проверкой времени компиляции.

20
задан Jérôme Verstrynge 23 August 2011 в 21:37
поделиться