Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将具有DI的过程代码转换为OO代码_Java_Cdi - Fatal编程技术网

Java 如何将具有DI的过程代码转换为OO代码

Java 如何将具有DI的过程代码转换为OO代码,java,cdi,Java,Cdi,我有一个使用CDI的项目。具有状态列表的容器管理的服务类 @ApplicationScoped public class StateService { @Inject MailService mailService; //Inject some other stuff private Map<String, State> state = new HashMap<String, State>(); public void ma

我有一个使用CDI的项目。具有状态列表的容器管理的服务类

@ApplicationScoped
public class StateService {

    @Inject
    MailService mailService;

    //Inject some other stuff

    private Map<String, State> state = new HashMap<String, State>();

    public void makeStateTransition(StateChange stateChange) {
        State currentState = state.get(stateChange.getKey());
        switch (currentState.stateType) {
            case STATE1:
                handleState1Transition(stateChange);
            case STATE2:
                handleState2Transition(stateChange);
            case STATE3:
                handleState3Transition(stateChange);
        }
    }

    private void handleState1Transition(StateChange stateChange) {
        //Do some stuff to handle state and use injected mailsender to send some email
        mailService.sendEmail("Send some email");
        //if some criteria is right create a new state and set it in the map
        State newState = new State();
        //Set some variable
        state.put(stateChange.getKey(), newState);
    }

    private void handleState2Transition(StateChange stateChange) {
        //Do stuff similar to above, maybe use other injected fields
    }

    private void handleState3Transition(StateChange stateChange) {
        //Do stuff similar to above
    }
}

public class State {

    public enum StateType {
        STATE1, STATE2, STATE3
    }

    public StateType stateType;

    //Bunch of other properties


}
这会产生更好的代码,特别是随着可能状态的数量增加。 问题是如何使注入的邮件发送者进入需要它的正确状态。一些州可能不需要它,而另一些州可能需要其他东西。因为状态不是由容器创建的,所以它们不能使用注入本身。 在状态的构造函数中传递注入的字段是可能的,但是注入的对象在非托管状态中可能会过时

我求助于在方法调用中将其作为参数发送,这样它应该总是新鲜的。如果许多注射需要作为参数发送,并且在某种程度上感觉错误,则非常麻烦

在本例中,您将如何处理状态对象所需的注入资源


请忽略类中的任何线程问题。

您可能希望在codereview.stackexchange上发布此问题
@ApplicationScoped
public class StateService {

    @Inject
    MailService mailSerice;

    //Inject some other stuff

    private Map<String, State> state = new HashMap<String, State>();

    public void makeStateTransition(StateChange stateChange) {
        State currentState = state.get(stateChange.getKey());
        State newState = currentState.handleStateChange(stateChange, mailService);
        state.put(stateChange.getKey(), newState);
    }
}
public abstract class State {
    //Some protected fields shared by all states

    public abstract State handleStateChange(StateChange stateChange, MailService mailService);
}

public class SomeState extends State {

    //Some properties specific to this state

    public State handleStateChange(StateChange stateChange, MailService mailSerice) {
        //Do some stuff to handle state and use injected mailsender to send some email
        mailSerice.sendEmail("Send some email");
        return new SomeOtherState();
    }
}