マップへのインジェクトが欲しかった、Google guice2.0 に正式リリースが待ち遠しい。
しかたなく、マップ生成にInject実行を隠蔽させることにしてのパターンである。
public class VettyFactory{
private Map<String,Vetty> vmap;
public VettyFactory(){
this.vmap = new HashMap<String,Vetty>();
}
// keyに対して、Vettyインターフェースを実装するclass を指定することで
// key ⇔ 任意のVetty実装インスタンス関係を構築し、getVettyMap() で
// そのMap を返せるようにする。
public void regist(String key,Class<? extends Vetty> cls){
Injector injector = Guice.createInjector(new _Module(cls));
VettyBuilder builder = injector.getInstance(VettyBuilder.class);
this.vmap.put(key,builder.getVetty());
}
/**
* @return Map<String,Vetty> key=キー, value=Vettyインスタンス
*/
public Map<String,Vetty> getVettyMap(){
return this.vmap;
}
class _Module implements Module{
private Class<? extends Vetty> vcls;
_Module(Class<? extends Vetty> cls){
this.vcls = cls;
}
/* (非 Javadoc)
* @see com.google.inject.Module#configure(com.google.inject.Binder)
*/
public void configure(Binder binder){
binder.bind(Vetty.class).to(this.vcls);
}
}
}
======== VettyBuilder.class =======================
import com.google.inject.Inject;
class VettyBuilder{
@Inject private Vetty vetty;
protected Vetty getVetty(){
return this.vetty;
}
}