2

たとえば、enumまたはがStringあり、そのパラメーターの値に基づいてディスパッチしたい場合、繰り返しパターンがあります。

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

if長いorcaseステートメントを取り除くための慣用的な方法は何ですか? 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 に答える