2009-06-24 10 views
15

W tym momencie rozwijam opartą na adnotacji ramkę wiążącą dla Java Swing, która używa pod maską JGoodies Binding. Niestety utknąłem z adnotacją o wiązaniu JRadioButton. Co chcę zrobić, to określić właściwość-nazwę modelu, który posiada specjalną wartość (wylicza). Przycisk radiowy należy wybrać, jeśli właściwość ma określoną wartość. Teraz chcę, aby określić wartość w adnotacji tak:Czy istnieje sposób zadeklarowania atrybutu adnotacji dla * any * enum?

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

@RadioButtonBinding(property = "selectedItem", selectedValue = MyEnum.SECOND) 
JRadioButton secondButton 

Jednak nie wiem jak deklarować adnotacji, aby umożliwić powyżej dowolny inne wyliczenia, too. Moje pierwsze przypuszczenie było takie, ale nauczyłem się, że atrybuty adnotacji nie mogą być ogólne:

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

} 

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

+0

Wymieniona tutaj adnotacja RadioButtonBinding zawiera dwie idee: Pierwszą z nich jest określenie klasy Enum i stałej String, która będzie z niej korzystać. Ale to oczywiście nie jest bezpieczne i może prowadzić do wyjątków RuntimeException. Po drugie, należy podać wartość wyliczenia bezpośrednio, ale to nie działa. –

+0

btw Zrobiłem dużo tego rodzaju rzeczy z JGoodies, jednym z bardziej nieszczęśliwych czasów, jakie miałem w Javie. Największym problemem jest to, że ma klasę "podstawową", którą rozszerza większość jego innych klas, a więc jego metody mają metodę sygnaturową (podstawową, podstawową, podstawową), gdzie przekazywana musi być "podstawowa" klasa, ale podpis nie daje wskazówek, na jaką konkretną klasę musi być instancja. Część wiązania była dobrym pomysłem, ale nie wsparł go dobrze w tamtym czasie (lata temu) i był niedokończony i tylko udokumentowany w języku niemieckim. –

Odpowiedz

3

To nie będzie działać tak, jak tego chcesz. Jak się dowiedziałeś, w adnotacjach możesz używać tylko naprawdę prostych typów zwracanych. Ponadto próba obejścia tych ograniczeń poprzez działanie takie, jak nadużywanie String, nie będzie działać, ponieważ musisz użyć stałego wyrażenia, aby zainicjować wartości adnotacji.

Myślę, że najbliższym osiągnięciem jest zainicjowanie za pomocą ciągu znaków, a następnie użycie kodu do porównania z nazwą wyliczenia(). Ale tam jest twoje bezpieczeństwo typ ...

1

Jeśli Twoje teksty stałe mogą realizować wszystkie ten sam interfejs, może się okazać użyteczny na to pytanie „Coding tip - intersection types and java enums

+0

Niestety nie, ale dziękuję za cynk. –

+0

Jak dokładnie użyłbyś tego wspólnego interfejsu w atrybucie adnotacji? ' & MyInterface> T enumValue();' nie działa lepiej niż bez interfejsu. – Imre

0

starałem się rozwiązać dokładnie ten sam problem, a jeśli chodzi o Wiem, nie da się tego zrobić. To prawdziwa dolegliwość.

W moim przypadku chciałem podać adnotację @Version, gdzie można użyć dowolnego wyliczenia, a wartości wyliczeniowe można porównać za pomocą liczby porządkowej (aby znaleźć porządek wersji). Wygląda na to, że muszę zrobić to, co robią inne frameworki (takie jak Guice) i zamiast tego używać dubletów; trochę brzydki, ale działa dobrze dla> = i < = sprawdza.

Powiązane problemy