Pytanie w sprawie java, enums, annotations – Czy istnieje sposób na zadeklarowanie atrybutu adnotacji dla * any * enum?

16

W tej chwili opracowuję opartą na adnotacjach strukturę wiązania dla Java Swing, która wykorzystujeJGoodies Binding pod maską. Niestety utknąłem z adnotacją do wiązania JRadioButton. Chcę podać nazwę właściwości modelu, który zawiera specjalną wartość (enum). Przycisk radiowy należy wybrać, jeśli ta właściwość ma określoną wartość. Teraz chcę określić wartość w adnotacji w następujący sposób:

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

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

Nie wiem jednak, jak zadeklarować adnotację, aby umożliwić powyższe ikażdy inne enum też. Moje pierwsze przypuszczenie było takie, ale dowiedziałem się, że atrybuty adnotacji nie mogą być ogólne:

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

Jakieś pomysły, jak to rozwiązać?

btw Zrobiłem dużo tego rodzaju rzeczy z JGoodies, jednym z bardziej żałosnych czasów w Javie. Największym problemem jest to, że ma klasę „podstawową”, której większość innych klas się rozszerza, a więc jego metody mają sygnaturę, taką jak metoda (baza, podstawa, baza), gdzie przekazywana klasa „podstawowa” musi być konkretną instancją, ale Podpis nie daje żadnej wskazówki co do konkretnej klasy, której musi być instancją. Partia wiązań była dobrym pomysłem, ale w tamtym czasie nie popierał jej dobrze (był to niedokończony i udokumentowany tylko w języku niemieckim). Bill K
Adnotacja RadioButtonBinding wymieniona tutaj zawiera dwie idee: Pierwszą z nich jest określenie klasy Enum i stałej String, która ma być z niej używana. Ale to oczywiście nie jest bezpieczne i może prowadzić do wyjątków RuntimeExceptions. Drugim jest określenie wartości wyliczenia bezpośrednio, ale to nie wydaje się działać. Roland Schneider

Twoja odpowiedź

3   odpowiedź
1
Niestety nie, ale i tak dziękuję za cynk. Roland Schneider
Jak dokładnie użyłbyś tego wspólnego interfejsu w atrybucie adnotacji?<T extends Enum<T> & MyInterface> T enumValue(); nie działa lepiej niż bez interfejsu. Imre
0

nie da się tego zrobić. To prawdziwy bummer.

W moim przypadku chciałem określić adnotację @Version, w której można użyć dowolnego wyliczenia, a wartości wyliczeniowe można porównać przez porządek (aby znaleźć kolejność wersji). Wygląda na to, że muszę zrobić to, co robią inne frameworki (jak sądzę Guice), a zamiast tego używać podwójnych; trochę brzydkie, ale działa poprawnie dla> = i <= kontroli.

3

jak chcesz. Jak się dowiedziałeś, w adnotacjach możesz używać tylko zwykłych typów powrotu. Dodatkowo, próba obejścia tych ograniczeń przez robienie rzeczy takich jak nadużywanie String nie zadziała, ponieważ musisz użyć stałego wyrażenia do inicjalizacji wartości adnotacji.

Myślę, że najbliższą ci drogą jest inicjalizacja za pomocą String, a następnie użycie kodu do porównania z nazwą enum (). Ale idzie twój typ bezpieczeństwa ...

Powiązane pytania