首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谷歌Guice中的AssistedInject和MapBinder

谷歌Guice中的AssistedInject和MapBinder
EN

Stack Overflow用户
提问于 2015-12-24 02:59:06
回答 1查看 964关注 0票数 1

我最近开始使用Guice,需要一些帮助。

我有一个带有构造函数的类,其中包含了要注入的参数的3个不同的变体。下面是这个班

代码语言:javascript
复制
@Inject public Bullet(EntityParams entityParams, Movable movable, Renderable renderable) {
    super(entityParams, movable, renderable);
}

在这里,entityParams应该是辅助注射。

Movable接口有多个实现,因此需要使用一个MapBinder。

Renderable接口只有一个实现,所以没有问题。

我现在要做的是->

代码语言:javascript
复制
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());
    }

}

工厂的课程给了我一颗子弹,但我只是想知道,这是他们更好的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-24 05:00:06

从现有代码开始

代码语言:javascript
复制
@Inject
public Bullet(
    EntityParams entityParams,
    Movable movable,
    Renderable renderable) {
    super(entityParams, movable, renderable);
}

首先,我要处理地图活页夹。

代码语言:javascript
复制
@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注释。

代码语言:javascript
复制
@Inject
public Bullet(
    @Assisted EntityParams entityParams,
    @Assisted String MovableType,
    Map<String, Provider<Movable>> movables,
    Renderable renderable) {
    super(entityParams, movables.get(movableType), renderable);
}

然后创建工厂界面。

代码语言:javascript
复制
public interface BulletFactory {
    public Bullet create(EntityParams entityParams, String movableType);
}

把它绑在一起。

代码语言:javascript
复制
bind(BulletFactory.class)
   .toProvider(FactoryProvider.newFactory(BulletFactory.class, Bullet.class));

现在您可以注入一个BulletFactory来创建新的Bullet

根据您的问题,最好是使用@Named而不是多绑定器(传入字符串类型并立即将其从多个绑定器中提取出来会感到有些尴尬),但这应该有效。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34446706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档