Давайте попробуем это вместо:
public 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;
}
@Override public String toString() {
return symbol;
}
abstract double apply(double x, double y);
}
Это будет работать, только если вы используете Java 5 или более позднюю версию, которая имеет обобщенные и перечисления. Это дает вам статический набор операций. Вы можете получить к ним доступ, набрав Operation.PLUS
или Operation.MINUS
и т. Д.
Чтобы проверить это, попробуйте это:
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));
}
За дополнительной информацией обращайтесь к Джошуа Блоху Effective Java, Second Edition .
Стоит отметить, что в Java нет понятия «указатели на функции». Скорее вы просто пишете интерфейс и пишете класс, который реализует этот интерфейс. Правильный класс для использования выбран во время выполнения; следовательно, это «таблица переходов», но она скрыта за семантикой объектно-ориентированного программирования. Это известно как полиморфизм .