Есть ли способ объявить атрибут аннотации для * any * enum?

В настоящее время я разрабатываю привязку на основе аннотаций для Java Swing, которая использует JGoodies Binding под капотом. К сожалению, я застрял в аннотации для привязки JRadioButton. Я хочу указать свойство-имя модели, которая содержит специальное значение (перечисление). Радиокнопка должна быть выбрана, если это свойство имеет определенное значение. Теперь я хочу указать значение в аннотации следующим образом:

@RadioButtonBinding(property = "selectedItem", selectedValue = MyEnum.FIRST)
JRadioButton firstButton

@RadioButtonBinding(property = "selectedItem", selectedValue = MyEnum.SECOND)
JRadioButton secondButton

Однако я не знаю, как объявить аннотацию, чтобы разрешить вышеупомянутое и любое другое перечисление. Мое первое предположение было это, но я узнал, что атрибуты аннотации не могут быть общими:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface RadioButtonBinding {

    /** The model-property to which the selected value is bound */
    String property();

    // Idea 1: Specifying the enum class and the enum constant as String - works but is not typesafe

    Class<? extends Enum<?>> enumClass();

    String enumConstantName();

    // Idea 2: Directly specifying the enum constant - gives a compile-time error

    <T extends Enum<T>> T enumValue();

}

Есть идеи, как это решить?

Ответы

Ответ 1

Он не будет работать так, как вы этого хотите. Как вы узнали, вы можете использовать только обычные типы возврата в аннотациях. Кроме того, попытка обойти эти ограничения, делая такие вещи, как злоупотребление String, не будет работать, потому что вам нужно использовать константное выражение для инициализации ваших значений аннотации.

Я думаю, что ближе всего вы собираетесь инициализировать String, а затем использовать код для сравнения с именем enum(). Но там идет ваш тип безопасности...

Ответ 3

Я пытался решить эту ту же проблему, и, насколько я знаю, это невозможно. Это настоящий облом.

В моем случае я хотел указать аннотацию @Version, где можно использовать любое перечисление, а значения enum можно сравнить по порядковым номерам (чтобы найти порядок версий). Похоже, мне нужно делать то, что делают другие фреймворки (например, Guice, я думаю), и вместо этого использовать двойники; бит уродливый, но работает нормально для >= и <= проверок.