2009-06-24 26 views
15

現時点では、ボンネットの下でJGoodies Bindingを使用するJava Swing用のアノテーションベースのバインディングフレームワークを開発しています。残念ながら、私はJRadioButtonバインディングのアノテーションがついていません。 私がしたいのは、特別な値(enum)を保持するモデルのプロパティ名を指定することです。このプロパティに特定の値がある場合、ラジオボタンが選択されます。今、私はこのような注釈で値を指定したい:* any * enumのアノテーション属性を宣言する方法はありますか?

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

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

しかし、私はあまりにも、上記とどの他の列挙を許可するように注釈を宣言するのか分かりません。私の最初の推測では、このでしたが、私は、注釈の属性は、一般的なことができないことを学んだ:

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

} 

任意のアイデアこれを解決する方法?

+0

ここにリストされているRadioButtonBindingアノテーションには、2つのアイデアがあります。まず、Enumクラスとそれから使用するString定数を指定します。しかし、これはもちろんタイプセーフではなく、RuntimeExceptionsにつながる可能性があります。 2番目は列挙型の値を直接指定することですが、これは機能していないようです。 –

+0

btw私はJGoodiesでこのようなことをたくさんやっていましたが、これはJavaでもっと悲惨な時代でした。最大の問題は、彼が他のクラスのほとんどが拡張する "ベース"クラスを持っていることです。メソッドのシグネチャ(ベース、ベース、ベース)は、 "ベース"クラスが渡される特定のインスタンスでなければなりません。署名は、あなたがどのような特定のクラスについてインスタンスのものでなければならないかというヒントを与えません。バインディング部分は良いアイデアでしたが、彼は当時(数年前)それをうまく補完しなかったし、未完成でドイツ語でしか書かれていませんでした。 –

答えて

3

あなたが望むようにはうまくいかないでしょう。あなたが知ったように、アノテーションには本当に単純な戻り値の型しか使用できません。また、注釈の値を初期化するために定数式を使用する必要があるため、Stringを悪用するなどの操作を行うことでこれらの制限を回避しようとしているわけではありません。

私が得ようとしているのは、Stringで初期化してからコードを使用してenumのname()と比較することです。しかし、あなたがこの質問を役に立つかもしれませんあなたのタイプの安全...

1

は、あなたの列挙型は、すべて同じインタフェースを実装することができればそこに行く「Coding tip - intersection types and java enums

+0

残念ながら、とにかくチップのためにありがとうございます。 –

+0

アノテーション属性にその共通インタフェースをどの程度正確に使用しますか? '&MyInterface> T enumValue();'は、インタフェースなしではうまく動作しません。 – Imre

0

私はこれと同じ問題を解決しようとすると、限りました私は知っている、それはできない。 本当に酷いです。

私の場合、列挙型を使用できる@Versionアノテーションを指定したいと思います。列挙型の値は序数で比較できます(バージョンの順序を見つけるために)。私はGuiceのようないくつかの他のフレームワークを行い、代わりにdoubleを使用する必要があるように見えます。ビットは醜いですが、> =と< =を確認してください。

関連する問題