Есть ли способ объявить атрибут аннотации для * любого * перечисления? - PullRequest
17 голосов
/ 24 июня 2009

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

@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();

}

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

Ответы [ 3 ]

3 голосов
/ 25 июня 2009

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

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

1 голос
/ 29 июня 2009

Если ваши перечисления могут реализовывать один и тот же интерфейс, вам может пригодиться этот вопрос " Совет по кодированию - типы пересечений и перечисления java "

0 голосов
/ 11 июля 2009

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

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

...