Есть ли способ объявить атрибут аннотации для * 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(). Но там идет ваш тип безопасности...
Ответ 2
Если ваши перечисления могут реализовать все тот же интерфейс, может оказаться полезным этот вопрос: Кодирование - типы пересечений и java-перечисления
Ответ 3
Я пытался решить эту ту же проблему, и, насколько я знаю, это невозможно.
Это настоящий облом.
В моем случае я хотел указать аннотацию @Version, где можно использовать любое перечисление, а значения enum можно сравнить по порядковым номерам (чтобы найти порядок версий). Похоже, мне нужно делать то, что делают другие фреймворки (например, Guice, я думаю), и вместо этого использовать двойники; бит уродливый, но работает нормально для >= и <= проверок.