我最近开始使用Guice并需要一些帮助。
我有一个带构造函数的类,它包含3个不同的要注入参数的变种。下面是班级
@Inject public Bullet(EntityParams entityParams, Movable movable, Renderable renderable) {
super(entityParams, movable, renderable);
}
此处entityParams
应该是辅助注射。
Movable
接口有多个实现,因此需要使用MapBinder。
Renderable
接口只有一个实现,所以它不是问题。
我现在要做的是 - >
public class DefaultEntityFactory implements EntityFactory {
private final Provider<Renderable> renderableProvider;
private final Map<String, Movable> movableMap;
@Inject public DefaultEntityFactory(Provider<Renderable> renderableProvider, Map<String, Movable> movableMap) {
this.renderableProvider = renderableProvider;
this.movableMap = movableMap;
}
@Override
public Bullet create(EntityParams entityParams, String movableType) {
return new Bullet(entityParams, movableMap.get(movableType), renderableProvider.get());
}
}
工厂班给了我一个子弹但我只是想知道他们是一个更好的方法吗?
答案 0 :(得分:3)
从现有代码开始
@Inject
public Bullet(
EntityParams entityParams,
Movable movable,
Renderable renderable) {
super(entityParams, movable, renderable);
}
首先,我会处理地图活页夹。
@Inject
public Bullet(
EntityParams entityParams,
String movableType,
Map<String, Provider<Movable>> movables,
Renderable renderable) {
super(entityParams, movables.get(movableType), renderable);
}
接下来,我将关注AssistedInject
帮助页面。 https://github.com/google/guice/wiki/AssistedInject
首先我添加了@Assisted
注释。
@Inject
public Bullet(
@Assisted EntityParams entityParams,
@Assisted String MovableType,
Map<String, Provider<Movable>> movables,
Renderable renderable) {
super(entityParams, movables.get(movableType), renderable);
}
然后创建工厂界面。
public interface BulletFactory {
public Bullet create(EntityParams entityParams, String movableType);
}
将它绑定在一起。
bind(BulletFactory.class)
.toProvider(FactoryProvider.newFactory(BulletFactory.class, Bullet.class));
您现在可以注入BulletFactory
来创建新的Bullet
。
根据您的问题,最好使用@Named
而不是多个绑定器(传递String类型并立即将其从多绑定器中拉出来感觉有点尴尬)但这应该工作