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