Java 如何实例化包含使用GUI中的Map binder实例化的Map实例变量的对象
如果一个对象(我们称之为workController)包含一个字符串到处理程序的映射(Java 如何实例化包含使用GUI中的Map binder实例化的Map实例变量的对象,java,dependency-injection,guice,Java,Dependency Injection,Guice,如果一个对象(我们称之为workController)包含一个字符串到处理程序的映射(map handlerMap),它是使用GUI模块内的mapBinder和其他也被注入的实例变量注入的。现在,如果我想在代码中实例化workController(假设我正在为workConsumer:workConsumerProvider创建一个提供者,该提供者依赖于workController,因此我需要实例化它并向workConsumer的构造函数提供workController),我应该再次声明整个映射
map handlerMap
),它是使用GUI模块内的mapBinder和其他也被注入的实例变量注入的。现在,如果我想在代码中实例化workController(假设我正在为workConsumer:workConsumerProvider创建一个提供者,该提供者依赖于workController,因此我需要实例化它并向workConsumer的构造函数提供workController),我应该再次声明整个映射并将其传递给workController的构造函数,还是有其他方法来实现这一点
考虑WorkController.java:
public class WorkController implements ActivityController {
private ObjectMapper objectMapper;
private final Map<String, Handler> handlerMap;
@Inject
public WorkController(final ObjectMapper objectMapper,
final Map<String, Handler> handlerMap) {
this.objectMapper = objectMapper;
this.handlerMap = handlerMap;
}
public void control() {
//call the handler = getHandler(string usecase)
//call the handler.handle()
}
public Handler getHandler(String useCase) {
Handler handler = eventHandlerMap.get(useCase);
return handler;
}
现在,为了为这个WorkConsumer注入实例变量字符串,我们创建了一个WorkConsumerProvider类:WorkConsumerProvider.java
public class ObjectMapperProvider implements Provider<ObjectMapper> {
@Override
public ObjectMapper get() {
final ObjectMapper mapper = new ObjectMapper();
return mapper;
}
}
public class WorkConsumerProvider implements Provider<WorkConsumer> {
@Override
public WorkConsumer get() {
final WorkConsumer workconsumer
= new WorkConsumer(getInstanceVariableOne(),
getInstanceVariableTwo(),
getInstanceVariableThree(),
getWorkController());
return workconsumer;
}
private String getInstanceVariableOne() {
//return these values based on configs.
}
private String getInstanceVariableTwo() {
//return these values based on configs.
}
private String getInstanceVariableThree() {
//return these values based on configs.
}
//This is the place where I have a doubt.
private WorkController getWorkController() {
//Should I declare a new map and populate it again in order to instantiate workController despite having populated it once inside the guice module workConsumerModule.java ?
//I haven't yet populated it here.
return new WorkController(new ObjectMapper(), new HashMap<String, Handler>());
}
公共类WorkConsumerProvider实现提供程序{
@凌驾
公共工作消费者获取(){
最终工作消费者工作消费者
=新的工作使用者(getInstanceVariableOne(),
getInstanceVariableTwo(),
getInstanceVariableThree(),
getWorkController());
返回工作消费者;
}
私有字符串getInstanceVariableOne(){
//根据配置返回这些值。
}
私有字符串getInstanceVariableTwo(){
//根据配置返回这些值。
}
私有字符串getInstanceVariableThree(){
//根据配置返回这些值。
}
//这就是我怀疑的地方。
私有工作控制器getWorkController(){
//我是否应该声明一个新映射并再次填充它,以便实例化workController,尽管在GUI模块workConsumerModule.java中填充过一次?
//我还没有在这里居住。
返回新的WorkController(新的ObjectMapper(),新的HashMap());
}
}您可以向提供程序中注入,这样就可以注入一个完全构造和实例化的WorkController
public class WorkConsumerProvider implements Provider<WorkConsumer> {
private final WorkController controller;
@Inject
WorkConsumerProvider(WorkController controller) {
this.controller = controller;
}
@Override
public WorkConsumer get() {
return new WorkConsumer(
/* instance variables */,
controller
);
}
//Your instance variables
}
公共类WorkConsumerProvider实现提供程序{
专用最终工作控制器;
@注入
WorkConsumerProvider(工作控制器){
this.controller=控制器;
}
@凌驾
公共工作消费者获取(){
返回新的WorkConsumer(
/*实例变量*/,
控制器
);
}
//您的实例变量
}
这将导致每个WorkConsumer
共享一个WorkController
如果希望每个实例都具有唯一的WorkController
,则可以将实例变量更改为Provider
,并将其插入。然后在WorkConsumerProvider\get()
中使用controllerProvider.get()
有很多好的信息,包括不同场景的最佳实践和示例。我认为实现您的目标将有助于回答您的问题。添加了代码片段。您的示例可能会简化,但您知道您不需要像现在这样使用
ObjectMapperProvider
。Guice将为您找到并实例化它,因为它有一个无参数构造函数,而不需要绑定或提供程序。
public class WorkConsumerProvider implements Provider<WorkConsumer> {
@Override
public WorkConsumer get() {
final WorkConsumer workconsumer
= new WorkConsumer(getInstanceVariableOne(),
getInstanceVariableTwo(),
getInstanceVariableThree(),
getWorkController());
return workconsumer;
}
private String getInstanceVariableOne() {
//return these values based on configs.
}
private String getInstanceVariableTwo() {
//return these values based on configs.
}
private String getInstanceVariableThree() {
//return these values based on configs.
}
//This is the place where I have a doubt.
private WorkController getWorkController() {
//Should I declare a new map and populate it again in order to instantiate workController despite having populated it once inside the guice module workConsumerModule.java ?
//I haven't yet populated it here.
return new WorkController(new ObjectMapper(), new HashMap<String, Handler>());
}
public class WorkConsumerProvider implements Provider<WorkConsumer> {
private final WorkController controller;
@Inject
WorkConsumerProvider(WorkController controller) {
this.controller = controller;
}
@Override
public WorkConsumer get() {
return new WorkConsumer(
/* instance variables */,
controller
);
}
//Your instance variables
}