gpt4 book ai didi

java - Google Guice 中的 AssistedInject 和 MapBinder

转载 作者:行者123 更新时间:2023-11-29 04:53:55 25 4
gpt4 key购买 nike

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

我有一个带有构造函数的类,其中包含 3 种不同的要注入(inject)的参数。下面是类

@Inject public Bullet(EntityParams entityParams, Movable movable, Renderable renderable) {
super(entityParams, movable, renderable);
}

这里entityParams应该是辅助注入(inject)

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

Renderable 接口(interface)只有一种实现,所以这不是问题。

我现在要做的是 ->

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());
}

}

工厂类给了我一个 Bullet,但我只是想知道这是他们做这件事的更好方法吗?

最佳答案

从您现有的代码开始

@Inject
public Bullet(
EntityParams entityParams,
Movable movable,
Renderable renderable) {
super(entityParams, movable, renderable);
}

首先我会处理 map Binder 。

@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);
}

然后创建工厂接口(interface)。

public interface BulletFactory {
public Bullet create(EntityParams entityParams, String movableType);
}

并将其绑定(bind)在一起。

bind(BulletFactory.class)
.toProvider(FactoryProvider.newFactory(BulletFactory.class, Bullet.class));

您现在可以注入(inject) BulletFactory 来创建新的 Bullet

根据您的问题,使用 @Named 代替 multi-binder 可能会更好(传入 String 类型并立即将其从 multi-binder 中拉出感觉有点尴尬) 但这应该有效。

关于java - Google Guice 中的 AssistedInject 和 MapBinder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34446706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com