型推論の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