使用 Guice 实现参数化工厂
我有一个工厂,我喜欢使用 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) 之类的东西并使用绑定来定义每种情况下应使用哪个对象?
I have a factory I like to reimplement using 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();
...
}
}
Is there an easy way to implement it?
Something like Provider.get(parameter) and using bindings to define which object should be used in each case?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您在这里有多种选择。
1. 由于您使用
enum
来区分实现,因此您拥有有限数量的实现,您可以使用自己的绑定来定义每个实现,前提是您在执行过程中使用注释 在您的Module
中注入:
然后在要注入的类中:
在这里您必须定义实现
SomeInterfaceKind
的SomeInterfaceKindImpl
类(是的,可以扩展一个注解!)有关更多详细信息,请查看 Guice 中如何实现Named
。2. 您还可以使用 Guice MapBinder 如下(我发现它更容易实现)
在您的模块中:
然后在注入的方法中:
You have several options here.
1. since you use an
enum
to distinguish between implementations, then you have a finite number of implementations that you can define each with their own binding, provided you use an annotation during injectionin your
Module
:Then in classes to be injected:
Here you have to define
SomeInterfaceKindImpl
class that implementsSomeInterfaceKind
(yes, it's possible to extend an annotation!) For more details, take a look at howNamed
is implemented in Guice.2. You can also use Guice MapBinder as follows (I find it simpler to implement)
In your Module:
Then in injected methods:
使用辅助注入
您还可以在模块中
然后然后您可以在任何需要的地方使用工厂
You can also use assisted inject
Then in your module
Then you can use the factory wherever you need it