2009-06-24 7 views
15

Attualmente sto sviluppando un framework di associazione basato su annotazioni per Java Swing che utilizza JGoodies Binding sotto il cofano. Sfortunatamente sono bloccato con un'annotazione per una rilegatura JRadioButton. Quello che voglio fare è specificare un nome-proprietà di un modello che contiene un valore speciale (enum). Il pulsante radio deve essere selezionato se questa proprietà ha un valore specifico. Ora voglio specificare il valore nel l'annotazione in questo modo:C'è un modo per dichiarare un attributo di annotazione per * any * enum?

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

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

Tuttavia, non so come dichiarare l'annotazione per consentire quanto sopra e qualsiasi altro enum, anche. La mia prima risposta è stata questa, ma ho imparato che gli attributi di annotazione non possono essere generici:

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

} 

Delle idee come risolvere questo problema?

+0

L'annotazione RadioButtonBinding qui elencata include due idee: La prima è specificare la classe Enum e la costante String da utilizzare da essa. Ma questo non è tipicamente sicuro e può portare a RuntimeExceptions. Il secondo è quello di specificare direttamente il valore di un enum, ma questo non sembra funzionare. –

+0

btw Ho fatto un sacco di cose del genere con JGoodies, una delle volte più miserabili che ho avuto in Java. Il problema più grande è che ha una classe "base" che la maggior parte delle sue altre classi estende e quindi i suoi metodi hanno un metodo simile alla firma (base, base, base), dove la classe "base" passata deve essere un'istanza specifica ma la la firma non fornisce alcun suggerimento su quale classe specifica debba essere un'istanza di. La parte degli attacchi è stata una buona idea, ma non lo ha fatto molto bene all'epoca (anni fa) ed era incompleto e solo documentato in tedesco. –

risposta

3

Non funzionerà nel modo desiderato. Come hai scoperto, puoi utilizzare solo tipi di ritorno veramente semplici nelle annotazioni. Inoltre, cercare di aggirare queste restrizioni facendo cose come abusare di String non funzionerà perché è necessario utilizzare un'espressione costante per inizializzare i valori delle annotazioni.

Penso che il più vicino che avremo è di inizializzare con una stringa e quindi utilizzare il codice per confrontare con il nome dell'enumerazione(). Ma ci va la vostra sicurezza tipo ...

1

Se le enumerazioni può implementare tutte la stessa interfaccia, si possono trovare utili a questa domanda "Coding tip - intersection types and java enums"

+0

Purtroppo no, ma grazie comunque per la mancia. –

+0

Come utilizzeresti esattamente quell'interfaccia comune in un attributo di annotazione? ' e MyInterface> T enumValue();' non funziona meglio che senza l'interfaccia. – Imre

0

stavo cercando di risolvere questo problema esattamente lo stesso, e per quanto Lo so, non si può fare. È un vero peccato.

Nel mio caso, volevo specificare l'annotazione @Version, dove è possibile utilizzare qualsiasi enumerazione ei valori enum possono essere confrontati ordinalmente (per trovare l'ordine delle versioni). Sembra che ho bisogno di fare quello che fanno altri framework (come Guice credo) e usare invece i doppi; un po 'brutto, ma funziona bene per> = e < = assegni.

Problemi correlati