Frage an enums, java, annotations – Gibt es eine Möglichkeit, ein Annotation-Attribut für * eine * Aufzählung zu deklarieren?

16

Momentan entwickle ich ein annotationsbasiertes Binding-Framework für Java Swing, das verwendet wirdJGoodies Bindung unter der Haube. Leider stecke ich bei einer Anmerkung für eine JRadioButton-Bindung fest. Ich möchte einen Eigenschaftsnamen eines Modells angeben, das einen speziellen Wert (enum) enthält. Das Optionsfeld ist auszuwählen, wenn diese Eigenschaft einen bestimmten Wert hat. Jetzt möchte ich den Wert in der Annotation wie folgt angeben:

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

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

Ich weiß jedoch nicht, wie ich die Annotation deklarieren soll, um die obigen undirgendein andere Aufzählung auch. Meine erste Vermutung war dies, aber ich habe gelernt, dass Anmerkungsattribute nicht generisch sein können:

<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>

Irgendwelche Ideen, wie man das löst?

Übrigens habe ich eine Menge solcher Sachen mit JGoodies gemacht, eine der elenderen Zeiten, die ich in Java hatte. Das größte Problem ist, dass er eine "Basis" -Klasse hat, die die meisten seiner anderen Klassen erweitert, und seine Methoden daher eine signaturähnliche Methode haben (base, base, base), wobei die übergebene "Basis" -Klasse eine bestimmte Instanz sein muss, aber die Signatur gibt Ihnen keinen Hinweis darauf, von welcher bestimmten Klasse es eine Instanz sein muss. Der Bindungsteil war eine gute Idee, aber er hat ihn damals (vor Jahren) nicht gut unterstützt und er war unvollendet und nur in deutscher Sprache dokumentiert. Bill K
Die hier aufgeführte RadioButtonBinding-Annotation enthält zwei Ideen: Die erste besteht darin, die Enum-Klasse und die daraus zu verwendende String-Konstante anzugeben. Dies ist natürlich nicht typsicher und kann zu RuntimeExceptions führen. Die zweite Möglichkeit besteht darin, den Wert einer Aufzählung direkt anzugeben, dies scheint jedoch nicht zu funktionieren. Roland Schneider

Deine Antwort

3   die antwort
3

wie Sie es wollen. Wie Sie herausgefunden haben, können Sie in Anmerkungen nur ganz normale Rückgabetypen verwenden. Darüber hinaus funktioniert es nicht, diese Einschränkungen zu umgehen, indem Sie beispielsweise String missbrauchen, da Sie einen konstanten Ausdruck verwenden müssen, um die Werte Ihrer Annotation zu initialisieren.

Ich denke, der nächste Schritt besteht darin, mit einem String zu initialisieren und dann den Code zum Vergleichen mit dem Namen der Aufzählung () zu verwenden. Aber da geht Ihre Typensicherheit ...

1

ist diese Frage möglicherweise hilfreich. "Codierungstipp - Schnittpunkttypen und Java-Enums"

Leider nicht, aber trotzdem danke für den Tipp. Roland Schneider
Wie genau würden Sie diese gemeinsame Schnittstelle in einem Anmerkungsattribut verwenden?<T extends Enum<T> & MyInterface> T enumValue(); funktioniert nicht besser als ohne die Schnittstelle. Imre
0

genau das gleiche Problem zu lösen, und soweit ich weiß, ist dies nicht möglich. Es ist ein echter Mist.

In meinem Fall wollte ich die Annotation @Version angeben, in der eine beliebige Aufzählung verwendet werden kann und die Aufzählungswerte nach Ordnungszahl verglichen werden können (um die Reihenfolge der Versionen zu ermitteln). Sieht so aus, als müsste ich das tun, was einige andere Frameworks (wie Guice, glaube ich) tun, und stattdessen double verwenden. etwas hässlich, funktioniert aber gut für> = und <= Prüfungen.

Verwandte Fragen