最後は「クラス・ベースの実現」。 ほどんど「インターフェース・ベースの実現」と同じですが、インターフェースの代わりに(ユーティリティー)クラスを用いているところが違います。 『Effective Java 第2版 (The Java Series)』で「定数インターフェースパターン」の代わりに使うべし、と言われている方法です。
アノテーションの実装
「インターフェース・ベースの実現」と同じような実装ですが、インターフェースの代わりにユーティリティークラス (utility class) を用います。 ユーティリティークラスは次の2つを踏まえた単なるクラスです:
これらはインスタンスを生成できないようにするためのものです。 この結果、このクラスのメンバーは static でなければいけません。 つまり、アノテーションの定義も (public) static にする必要があります*2。
public final class ServiceProvider { private ServiceProvider(){} @Documented @Target(ElementType.TYPE) public static @interface Service{} @Documented @Target(ElementType.METHOD) public static @interface ProviderRegistration {} @Documented @Target(ElementType.METHOD) public static @interface ServiceAccess {} @Documented @Target(ElementType.TYPE) public static @interface Provider {} }
アノテーションの使用
上記のアノテーションの使用方法は以下のようになります。
// 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 インポートを使わずに、どのデザインパターンの役割かを明示する方が個人的には良いかと。

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