gpt4 book ai didi

java - 使用 Guice 实现参数化工厂

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:00:17 25 4
gpt4 key购买 nike

我有一个我喜欢使用 Guice 重新实现的工厂:

enum MyObjects { OBJECT1, OBJECT2, ... }
class Object1 implements SomeInterface { ... }
class Object2 implements SomeInterface { ... }
...
class Factory {
public static SomeInterface createObject(MyObjects obj) {
switch (obj) {
case OBJECT1: return new Object1();
case OBJECT2: return new Object2();
...
}
}

有没有简单的实现方法?类似于 Provider.get(parameter) 并使用绑定(bind)来定义在每种情况下应该使用哪个对象?

最佳答案

这里有几个选项。

1. 因为您使用 enum 来区分实现,所以您可以使用有限数量的实现来定义每个实现,前提是您使用注入(inject)时的注解

public @interface SomeInterfaceKind {
MyObjects value();
}

在您的模块中:

bind(SomeInterface.class)
.annotatedWith(new SomeInterfaceKindImpl(MyObjects1.OBJECT1)
.to(Object1.class);
...

然后在要注入(inject)的类中:

@Inject void setSomeInterface(
@SomeInterfaceKind(MyObjects.OBJECT1) SomeInterface object) {...}

在这里,您必须定义实现 SomeInterfaceKindSomeInterfaceKindImpl 类(是的,可以扩展注释!)有关更多详细信息,请查看 命名在Guice中实现。

2.你也可以像下面这样使用Guice MapBinder(我觉得实现起来更简单)

在您的模块中:

MapBinder.newMapBinder(MyObjects.class, SomeInterface.class)
.addBinding(MyObjects.OBJECT1).to(Object1.class);
MapBinder.newMapBinder(MyObjects.class, SomeInterface.class)
.addBinding(MyObjects.OBJECT2).to(Object2.class);

然后在注入(inject)方法中:

@Inject void setSomeInterface(Map<MyObjects, SomeInterface> map) {
SomeInterface object1 = map.get(MyObjects.OBJECT1);
...
}

关于java - 使用 Guice 实现参数化工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6373683/

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