Вчера видях един от коментарите на предишно мое писание (ето това) и се сетих за нещо, което може да ми влезне в употреба. След като имам краен брой операции (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:
Post a Comment