今回は「enum ベースの実現」。 これは役割を指定するための列挙型を別途作成して、アノテーションの引数として使用する方法です。 この enum ベースの方法は、他の3つとチョット感じが違います。
アノテーションの実装
「enum ベースの実現」では、
の2つを定義する必要があります:
ServiceProvider.java
@Documented @Target({ElementType.TYPE, ElementType.METHOD}) public @interface ServiceProvider { ServiceProviderRole value(); }
ServiceProviderRole.java
public enum ServiceProviderRole{ SERVICE, PROVIDER, PROVIDER_REGISTRATION, SERVICE_ACCESS }
役割を指定する列挙型を @ServiceProvider アノテーションの static なメンバークラスとして定義することもできないことはありません:
@Documented @Target({ElementType.TYPE, ElementType.METHOD}) public @interface ServiceProvider { Role value(); enum Role{ SERVICE, PROVIDER, PROVIDER_REGISTRATION, SERVICE_ACCESS } }
このときのアノテーションは @ServiceProvider(ServiceProvider.Role.SERVICE) のようになりますが、ちょっと不格好かな? static インポートを使うと見易くはなりますが。
アノテーションの使用
上記のアノテーションの使用方法は以下のようになります:
// Effective Java 第2版 // 『項目1 コンストラクタの代わりに static ファクトリーメソッドを検討する』より import static ServiceProviderRole.*; @ServiceProvider(SERVICE) public interface Service { ... // サービス固有のメソッドをここに } @ServiceProvider(PROVIDER) public interface Provider { Service newService(); } public final class Services { ... @ServiceProvider(PROVIDER_REGISTRATION) public static void registrerDefaultProvider(Provider p){...} @ServiceProvider(PROVIDER_REGISTRATION) public static void registerProvider(String name, Provider p){...} @ServiceProvider(SERVICE_ACCESS) public static Service newInstance(){...} @ServiceProvider(SERVICE_ACCESS) public static Service newInstance(String name){...} }
アノテーションを付加するターゲット (@Target) を個々の役割で別個に指定することができない(@ServiceProvider(SERVICE) をメソッドに付加することもできる)のが難点かな。

Effective Java 第2版 (The Java Series)
- 作者: Joshua Bloch,柴田芳樹
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2008/11/27
- メディア: 単行本(ソフトカバー)
- 購入: 77人 クリック: 936回
- この商品を含むブログ (262件) を見る
川口耕介氏の新連載『やっぱりJavaがスキ!』がスタート↓

- 作者: 杉山貴章,羽生章洋,小飼弾,角田直行,橋本正徳,はまちや2,久末隆裕,Junio C Hamano,グニャラくん,やまだあきら,川口耕介,青木靖,鶴岡直也,長野雅広,森田創,伊藤直也,武者晶紀,ミック,高林哲,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2009/04/24
- メディア: 大型本
- 購入: 24人 クリック: 235回
- この商品を含むブログ (95件) を見る