Вопрос по java – Есть ли способ объявить атрибут аннотации для * любого * перечисления?

16

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

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

@RadioButtonBinding(property = "selectedItem", selectedValue = MyEnum.SECOND)
JRadioButton secondButton
</code>

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

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

}
</code>

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

Перечисленная здесь аннотация RadioButtonBinding включает две идеи: первая заключается в указании класса Enum и используемой из него константы String. Но это, конечно, небезопасно и может привести к RuntimeExceptions. Второй способ заключается в непосредственном указании значения перечисления, но это, похоже, не работает. Roland Schneider
Кстати, я много чего такого делал с JGoodies, один из самых ужасных моментов, которые у меня были на Java. Самая большая проблема заключается в том, что у него есть «база» класс, который расширяет большинство других его классов, и поэтому его методы имеют метод, подобный сигнатуре (base, base, base), где & quot; base & quot; передаваемый класс должен быть конкретным экземпляром, но подпись не дает подсказки относительно того, к какому конкретному классу он должен принадлежать. Часть связываний была хорошей идеей, но он не поддерживал ее в то время (несколько лет назад), и она была незавершенной и документированной только на немецком языке. Bill K

Ваш Ответ

3   ответа
0

и, насколько я знаю, это не может быть сделано. Это настоящий облом.

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

1

вам может пригодиться этот вопрос & quot;Совет по кодированию - типы пересечений и java-перечисления& Quot;

Error: User Rate Limit Exceeded<T extends Enum<T> & MyInterface> T enumValue();Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Roland Schneider
3

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

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

Похожие вопросы