Java 如何实例化包含使用GUI中的Map binder实例化的Map实例变量的对象

Java 如何实例化包含使用GUI中的Map binder实例化的Map实例变量的对象,java,dependency-injection,guice,Java,Dependency Injection,Guice,如果一个对象(我们称之为workController)包含一个字符串到处理程序的映射(map handlerMap),它是使用GUI模块内的mapBinder和其他也被注入的实例变量注入的。现在,如果我想在代码中实例化workController(假设我正在为workConsumer:workConsumerProvider创建一个提供者,该提供者依赖于workController,因此我需要实例化它并向workConsumer的构造函数提供workController),我应该再次声明整个映射

如果一个对象(我们称之为workController)包含一个字符串到处理程序的映射(
map handlerMap
),它是使用GUI模块内的mapBinder和其他也被注入的实例变量注入的。现在,如果我想在代码中实例化workController(假设我正在为workConsumerworkConsumerProvider创建一个提供者,该提供者依赖于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
}