Friday, September 28, 2007

Enum as dispatcher

    Вчера видях един от коментарите на предишно мое писание (ето това) и се сетих за нещо, което може да ми влезне в употреба. След като имам краен брой операции (enum), не може ли да "разхвърлям". Добре, няма да е много трудно. Примерно две операции: минус и плюс.

protected interface SumHandler {
   String handle(int one, int two);
}

protected enum Operation {

    minus(new MinusHandler()), plus(new PlusHandler());
    SumHandler handler;

    Operation(SumHandler handler) {
        this.handler = handler;
    }

    public String process(int one, int two) {
        return handler.handle(one, two);
    }
}

Това е случая, в който операциите плюс и минус са мнооого трудоемки или пък ни тряба отделна инстанция за всеки един от тях. При мен случая обаче е друг, много кратки обработки(даже тривиални), за които не е нужен никакво състояние.
Затова се изхитрям и ги реализирам като стойност, на която "присвоявам" функция. Да така е макар, че не се вижда на пръв поглед.
public class EnumAsDispatcher {
    private final static Logger log = Logger.getLogger(EnumAsDispatcher.class);

    protected interface SumHandler {
        String handle(int one, int two);
    }

    private static SumHandler minusHandler = new SumHandler() {

    public String handle(int one, int two) {
        log.debug("Substitution: one = " + one + ", two = " + two);
        return "Success substitution";
    }
};

private static SumHandler plusHandler = new SumHandler() {
    public String handle(int one, int two) {
        log.debug("Sum: one = " + one + ", two = " + two);
        return "Success sum";
    }
};

/** Enumeration for all operations (with attached functionality for each operation) */
protected enum Operation {
    minus(minusHandler), plus(plusHandler);

    SumHandler handler;

    Operation(SumHandler handler) {
        this.handler = handler;
    }

    public String process(int one, int two) {
        return handler.handle(one, two);
    }
}

    public static void main(String[] args) {

        String mathOperation = "minus";

        Operation operation = Operation.valueOf(mathOperation);
        operation.process(1, 2);

        mathOperation = "plus";

        operation = Operation.valueOf(mathOperation);
        operation.process(2, 1);
    }
}


Така че благодаря за подсказката

No comments:

algorithms (1) cpp (3) cv (1) daily (4) emacs (2) freebsd (4) java (3) javascript (1) JSON (1) linux (2) Lisp (7) misc (8) programming (16) Python (4) SICP (1) source control (4) sql (1) думи (8)