Gibt es eine Möglichkeit, zu erklären, eine annotation-Attribut für *alle* enum?
Im moment bin ich die Entwicklung eines annotation-basierten binding-framework für Java Swing verwendet JGoodies Binding unter der Haube. Leider bin ich stecken mit einer Anmerkung für einen JRadioButton-Bindung.
Was ich tun möchte, ist eine Eigenschaft angeben, die-name eines Modells, das hat einen besonderen Wert (enum). Der radio-button ausgewählt werden, wenn diese Eigenschaft mit einem bestimmten Wert. Jetzt möchte ich den Wert angeben, in den Anmerkungen wie diese:
@RadioButtonBinding(property = "selectedItem", selectedValue = MyEnum.FIRST)
JRadioButton firstButton
@RadioButtonBinding(property = "selectedItem", selectedValue = MyEnum.SECOND)
JRadioButton secondButton
Aber ich weiß nicht, wie zu erklären, dass die annotation zu erlauben, die oben und alle anderen enum auch. Meine erste Vermutung war, aber ich habe gelernt, dass die annotation Attribute können nicht generisch sein:
@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();
}
Irgendwelche Ideen wie man dieses Problem lösen?
- Die RadioButtonBinding annotation aufgeführt hier beinhaltet zwei Ideen: Die erste ist die Angabe der Enum-Klasse und die String-Konstante verwenden aus. Aber das ist nicht typesafe natürlich und kann dazu führen, RuntimeExceptions. Das zweite ist, geben Sie den Wert von enum direkt, aber das scheint nicht zu funktionieren.
- btw ich habe eine Menge von dieser Art von Sachen mit JGoodies, ein eher jämmerliches mal hatte, habe ich in Java. Das größte problem ist, dass er eine "Basis" - Klasse, die die meisten seiner anderen Klassen erweitern und so seine Methoden haben die Signatur wie Methode(Basis,base,base), wo die "Basis" - Klasse übergeben werden muss eine bestimmte Instanz, sondern die Signatur gibt Sie keinen Hinweis auf genau das, was bestimmte Klasse muss es eine Instanz. Die Bindungen Teil eine gute Idee war, aber er wusste nicht, suport es auch an der Zeit (vor Jahren) und es war unvollendet und dokumentiert lediglich in Deutsch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Geht es nicht so funktioniert, wie Sie es wollen. Als Sie herausgefunden haben, können Sie nur die wirklich einfachen Rückgabetypen in Anmerkungen. Zusätzlich versuchen zu bekommen, um diese Einschränkungen, indem Sie Dinge tun, wie missbrauchen String nicht zur Arbeit gehen, weil Sie brauchen, um mit einem Konstanten Ausdruck für die Initialisierung Ihrer Anmerkung die Werte.
Ich denke, die nächsten, die Sie bekommen werden, ist die Initialisierung mit einem String und verwenden Sie dann code zu vergleichen mit der enum-name(). Aber es geht Ihrer Art Sicherheit...
Wenn Ihr enums implementieren alle die gleiche Schnittstelle, die Sie nützlich finden können diese Frage mit "Coding-Tipp - intersection-Typen und java-enums"
<T extends Enum<T> & MyInterface> T enumValue();
funktioniert nicht besser als ohne das interface.Ich versuchte, dies zu lösen, genau das gleiche problem, und soweit ich weiß, es kann nicht getan werden.
Es ist eine echte Enttäuschung.
In meinem Fall, ich wollte angeben, die @Version-annotation, bei denen eine enumeration verwendet werden kann, und enum-Werte können verglichen werden, indem Sie die Ordnungszahl (zu finden Bestellung von Versionen). Sieht aus wie ich brauche, um zu tun, was einige andere frameworks wie Guice glaube ich) tun, und verwenden Sie verdoppelt, statt; bisschen hässlich, aber funktioniert ok für >= und <= prüft.