関連†
- Java
- enum
概要†
enum要素のアノテーションをenumのメソッドで取得します。
次のようにenum Testを定義しているとき
enum Test { @Foo HOGE, }
次のように取得したい。
Foo foo = Test.HOGE.getFoo();
方法†
enum Test { @Foo HOGE, Foo getFoo() { return this.getClass().getField(this.name()).getAnnotation(Foo.class); } }
※実際にはもっとスコープの指定とか例外処理とかが必要です
ちなみにアノテーションは次のようにしてフィールドに紐づけられるようにします。
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) public @interface Foo { }
解説†
アノテーションは静的な定義なのでオブジェクトからではなくクラスから取得することができます。 さらに今回取得したい対象のenum要素はフィールドなのでクラスからフィールドをたどる必要があります。
- this.getClass()
- インスタンスなフィールド(this)から静的なクラス(Test)を取得します
- .getField(this.name())
- 静的なクラス(Test)から静的なフィールド(HOGE)を取得します
- .getAnnotation(Foo.class)
- 静的なフィールド(HOGE)からアノテーション(Foo)を取得します
少し面倒ですね。