如何根据Java中的参数值进行调度?

时间:2013-07-10 12:08:55

标签: java python dispatch

当我有一个enumString并且我想根据该参数的值进行调度时,会出现重复出现的模式:

public void myMethod(String parameter) {
    if(parameter.equals(something)) {
        doSomething();
    } else if(parameter.equals(somethingElse)) {
        doSomethingElse();
    }
}

摆脱冗长的ifcase陈述的惯用方法是什么?我正在考虑像python中的单个调度泛型函数,但我想根据值而不是类型进行调度。

@fun.register(int)
def _(arg, verbose=False):
    if verbose:
        print("Strength in numbers, eh?", end=" ")
    print(arg)

@fun.register(list)
def _(arg, verbose=False):
    if verbose:
        print("Enumerate this:")
    for i, elem in enumerate(arg):
        print(i, elem)

3 个答案:

答案 0 :(得分:2)

你可以在java中使用方法覆盖..所以等价物应该像

public void doSomething(String arg) {
//do something when param is string
}

public void doSomething(List<String> arg) {
//do something else when param is a List of String
}

答案 1 :(得分:2)

我发现这在处理具有多个“动作”的表单(例如)时最常见。虽然这看起来有些过分,但很多时候它只是更简洁地“注册”动作处理程序(在很多方面,更容易)。

public class Dispatcher {

    private Map<String, ActionHandler> actionHandlerMap = new HashMap<String, ActionHandler>();

    public void perform(String action) {
        ActionHandler handler = actionHandlerMap.get(action);

        if (null == handler) {
            // no handler - throw an exception?
        }

        handler.execute();
    }

    public void addActionHandler(ActionHandler handler) {
        actionHandlerMap.put(handler.getAction(), handler);
    }

}

public interface ActionHandler {

    public String getAction();
    public void execute();

}

它绝对是更多的代码,但它具有可扩展性,清晰性,并且可以更好地分离关注点。它也更容易 testable ,这总是一件好事。

答案 2 :(得分:0)

在Java中,enum也是一个类,因此您可以对其进行扩展并将其用作:

interface Doable {
     void doSomething();
}
enum Stuff implements Doable {
     ONE() {
        public doSomething() { System.out.println("do one");};
     },
     TWO() {
        public doSomething() { System.out.println("do two");};
     }
}
Doable s = Stuff.valueOf("ONE");
s.doSomething();