型推論のS2Containerラッパー

型推論の要素を盛り込んだS2Containerのラッパーを作ってみました。


たとえば、

HttpServletRequest req = SingletonS2Container.getComponent(HttpServletRequest.class);
JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);
HogeService hogeService = SingletonS2Container.getComponent(HogeService.class);

は、次のように書き換えることができます。

HttpServletRequest req = S2.lookup();
JdbcManager jdbcManager = S2.lookup();
HogeService hogeService = S2.lookup();


型推論により変数の型をキーとして、
S2Containerからコンポーネントを取得することができます。


実際に作成してみたクラスは次の通りです。

public class S2 {
    public static <T> T lookup(T... x) {        
        Class<?> clazz = x.getClass().getComponentType();
        return (T)SingletonS2Container.getComponent(clazz);
    }
}

ちょっとトリッキーなコードなので、
lookupメソッドの引数は空で呼ばれないと困るようになっています。


S2Container内にコンポーネントが見つからなければ、
ComponentNotFoundRuntimeExceptionがスローされます。


追記:
この方法は、あくまでも実験的なものであって、
実務で使うには問題ありますので、その点はご注意。


追記:
T... の方法は、Eclipse上のコンパイラ上でしか動作しないようです。残念!
http://d.hatena.ne.jp/unageanu/20080715/1216115987