当我有一个enum
或String
并且我想根据该参数的值进行调度时,会出现重复出现的模式:
public void myMethod(String parameter) {
if(parameter.equals(something)) {
doSomething();
} else if(parameter.equals(somethingElse)) {
doSomethingElse();
}
}
摆脱冗长的if
或case
陈述的惯用方法是什么?我正在考虑像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)
答案 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();