2

当我有例如 anenum或 aString并且我想根据该参数的值进行调度时,会出现一种重复模式:

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)
4

3 回答 3

4

我发现这在处理具有多个“动作”的表单(例如)时最常见。虽然这看起来有点矫枉过正,但很多时候,简单地“注册”动作处理程序实际上要干净得多(并且在许多方面更容易)。

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();

}

它绝对是更多的代码,但它是可扩展的、干净的,并且允许更好地分离关注点。它也更容易测试,这总是一件好事。

于 2013-07-10T12:39:12.170 回答
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
}
于 2013-07-10T12:13:06.930 回答
0

在 Java 中,枚举也是一个类,因此您可以扩展它并将其用作:

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();
于 2019-01-05T01:47:07.360 回答