有没有办法为*any*枚举声明注释属性?

2022-09-01 21:25:50

目前,我正在为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 之类的操作来绕过这些限制是行不通的,因为您需要使用常量表达式来初始化注释的值。

我认为你最接近的是用一个字符串初始化,然后使用代码与枚举的name()进行比较。但是有你的类型安全...


答案 2

如果你的枚举可以实现所有相同的接口,你可能会发现这个问题很有用“编码技巧 - 交集类型和java枚举”"