Перечисление - это синтаксический сахар над обычным классом, так что нет никаких технических ограничений к тому, чтобы напихать в него логику. Кроме того, это бывает уместно и с архитектурных позиций. Джошуа Блоха в статье 30 шестой главы своего хрестоматийного труда "Effective Java" приводит несколько таких примеров. Один из них очень похож на ваш:
enum Operation {
PLUS("+") {
double apply(double x, double y) { return x + y; }
},
MINUS("-") {
double apply(double x, double y) { return x - y; }
},
TIMES("*") {
double apply(double x, double y) { return x * y; }
},
DIVIDE("/") {
double apply(double x, double y) { return x / y; }
};
private final String symbol;
Operation(String symbol) {
this.symbol = symbol;
}
@Overrided
public String toString() {
return symbol;
}
abstract double apply(double x, double y);
}
public class Example {
public static void main(String[] args) {
double x = Double.parseDouble(args[0]);
double y = Double.parseDouble(args[1]);
for (Operation op : Operation.values())
System.out.printf("%f %s %f = %f%n", x, op, y, op.apply(x, y));
}
}
}