今回は「インターフェース・ベースの実現」。 この方法は定数インターフェースパターンと同じようなところがあるので、あまり良くないかと。
アノテーションの実装
「インターフェース・ベースの実現」では、デザインパターン名と同じ名前のインターフェース内に、static メンバーとしてそこで使われるアノテーションを定義します。 アノテーションの定義自体は「パッケージ・ベースの実現」と同じです。
ServiceProvider.java
public interface ServiceProvider { @Documented @Target(ElementType.TYPE) @interface Service{} @Documented @Target(ElementType.TYPE) @interface Provider {} @Documented @Target(ElementType.METHOD) @interface ProviderRegistration {} @Documented @Target(ElementType.METHOD) @interface ServiceAccess {} }
アノテーションの使用
上記のアノテーションの使用方法は以下のようになります:
// Effective Java 第2版 // 『項目1 コンストラクタの代わりに static ファクトリーメソッドを検討する』より @ServiceProvider.Service public interface Service { ... // サービス固有のメソッドをここに } @ServiceProvider.Provider public interface Provider { Service newService(); } public final class Services { ... @ServiceProvider.ProviderRegistration public static void registrerDefaultProvider(Provider p){...} @ServiceProvider.ProviderRegistration public static void registerProvider(String name, Provider p){...} @ServiceProvider.ServiceAccess public static Service newInstance(){...} @ServiceProvider.ServiceAccess public static Service newInstance(String name){...} }
幾つか注意を:
- static インポートを用いれば、(名前が衝突しない限り)@ServiceProvider.Service を @Service のように書けます。 ただし、どのデザインパターンの役割かが分かりやすいので、static インポートをせずに使うのもアリかと。
- メソッドにアノテーションを付加する場合には、デザインパターンとなるインターフェースを実装するという手もあります。 ただ、定数インターフェースパターンと同じ理由でしない方がいいでしょうけど。
public final class Services implements ServiceProvider{ ... @ServiceAccess // @ServiceProvider.ServiceAccess としなくてよい public static Service newInstance(){...} }

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件) を見る