倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

アノテーションでデザインパターンの役割をマークする (0):準備

デザインパターンフレームワーク、イディオムなどを使用する際、どのクラスやメソッドがどの役割を果たしているのかってのを分かりやすくするためにアノテーションを使ってはどうか?と思い、チョット試してみました。

アノテーションを読み込んで処理をする」ってなことをしようと思うと大変でしょうが、マーキングをするだけならそんなに難しくはありません。 ただ、実現の仕方を4つほど思いついたんですが、どれがベストなのかがチョット悩ましいところ。

  • パッケージ・ベース
  • enum ベース
  • インターフェース・ベース
  • クラス・ベース

それぞれを次回以降見ていきますが、パッケージ・ベースが一番素直な実装でしょうか。

今回は、次回以降にサンプルで用いるフレームワーク「サービスプロバイダーフレームワーク (service provider framework)」のコードを紹介。 おもいっきり『Effective Java 第2版 (The Java Series)』からサンプルを拝借してます。 訴えられるとマズイので、「皆さん、『Effective Java 第2版 (The Java Series)』を買いましょう!」と宣伝しておきます(笑)

// Effective Java 第2版
// 『項目1 コンストラクタの代わりに static ファクトリーメソッドを検討する』より
// サービスプロバイダーフレームワークのスケッチ

// サービスインターフェース
public interface Service {
    ...  // サービス固有のメソッドをここに
}

// サービスプロバイダーインターフェース
public interface Provider {
    Service newService();
}

// サービス登録とアクセスのためのインスタンス化不可能クラス
public final class Services {

    private Services(){}  // インスタンス化を抑制
    
    // サービス名とサービスを対応づける
    private static final Map<String, Provider> providers
         = new ConcurrentHashMap<String, Provider>();
    
    public static final String DEFAULT_PROVIDER_NAME = "<def>";
    
    // プロバイダー登録 API
    public static void registrerDefaultProvider(Provider p){
        registerProvider(DEFAULT_PROVIDER_NAME, p);
    }
    
    public static void registerProvider(String name, Provider p){
        providers.put(name, p);
    }
    
    // サービスアクセス API
    public static Service newInstance(){
        return newInstance(DEFAULT_PROVIDER_NAME);
    }
    
    public static Service newInstance(String name){
        Provider p = providers.get(name);
        if(p == null)
            throw new IllegalArgumentException();
        
        return p.newService();
    }
}

このフレームワークで出てくる役割は次の4つ:

  • サービスインターフェース (@Service)
  • サービスプロバイダーインターフェース (@Provider)
  • プロバイダー登録 API (@ProviderRegistration)
  • サービスアクセス API (@ServiceAccess)

Effective Java 第2版 (The Java Series)

Effective Java 第2版 (The Java Series)


川口耕介氏の新連載『やっぱりJavaがスキ!』がスタート↓
WEB+DB PRESS Vol.50

WEB+DB PRESS Vol.50