2012年12月9日日曜日

java でのmemcached ラッパー

Javaでmemcachedを利用する際に、

1.キーからオブジェクトget
2.オブジェクトがnullならデータ取得
3.2で取得したデータをmemcachedにset

というのは割りとよくある一連の実装だと思います。

前職でC#を使っているときはdelegate(ラムダ式)を使って
1つのメソッドで一連の処理を実装していました。


Javaでも同じように実装してみます。
Delegateはこんなかんじでいいのかな…
Delegate interfaceを定義、そのgetメソッドから取得するように。

public class Memcached {

    protected static MemCachedClient mcc = new MemCachedClient();

    static {
        SockIOPool pool = SockIOPool.getInstance();
        //設定
        pool.initialize();
    }
   
    public static <T> T get(String key, Memgetable<T> delegate, Date expire){
        Object ret = null;
        ret = mcc.get(key);
      
        if (ret != null) return ret;
      
        ret = (T) delegate.get();
      
        if (ret == null) return null;
      
        mcc.set(key, ret, expire);
      
        return ret;
    }  

    public interface Memgetable<T> {
        public T get();
    }

}



呼び出しは、


String key = "test_key";
final String value = "test_value";

Memcached.get(key, new Memgetable<String>() {
    public String get() {
        return value;
    }
}, new Date());



こんなかんじで、一行で出来ます。
Delegate interfaceにgetメソッドを定義し値がなければメソッドから値を取得します。


ラムダ式周りはC#が素晴らしすぎてJavaの非力さが露呈してしまう。。
Java 8ではもっと楽に実装できるようになるのかしら。

0 件のコメント: