La forma orientada a objetos para hacerlo sería usar una enumeración de las posibles operaciones. De esta forma, cada operación solo podría consumir un objeto en la memoria.
public enum Operation {
ADD() {
public int perform(int a, int b) {
return a + b;
}
},
SUBTRACT() {
public int perform(int a, int b) {
return a - b;
}
},
MULTIPLY() {
public int perform(int a, int b) {
return a * b;
}
},
DIVIDE() {
public int perform(int a, int b) {
return a/b;
}
};
public abstract int perform(int a, int b);
}
Para llamar a dicho código, usted entonces hacer algo como:
int result = Operation.ADD(5, 6);
Posteriormente, se podría crear un mapa de Cuerdas de Operaciones, así:
Map<String, Operation> symbols = new Map<String, Operation>();
symbols.put("+", Operation.ADD);
symbols.put("-", Operation.SUBTRACT);
symbols.put("/", Operation.DIVIDE);
symbols.put("*", Operation.MULTIPLY);
...
Por último, a use tal sistema:
symbols.get(n.getString(1).apply(tmp1, tmp2));
Una ventaja de usar las enumeraciones de esta manera es que usted tiene el lujo de la comparación de las operaciones sobre los datos, si decide hacerlo
Operation operation = symbols.get("*");
if (operation != Operation.MULTIPLY) {
System.out.println("Foobar as usual, * is not multiply!");
}
Además, se obtiene una ubicación centralizada para todas las operaciones, el único La desventaja de esto es que el archivo Operation.java puede agrandarse con un conjunto suficientemente grande de operadores.
Los únicos problemas que pueden existir a largo plazo es que, si bien dicho sistema es útil y fácil de leer y comprender, realmente no tiene en cuenta la prioridad. Suponiendo que su fórmula se evalúa en el orden de precedencia, tal problema no importa. Ejemplos de expresar la fórmula en el orden de precedencia se pueden encontrar en notación polaca inversa, notación polaca, etc.
Dónde precedencia que importa es cuando se le permite expresar artículos como:
4 + 5 * 2
donde según según la convención típica, el 5 * 2 debe evaluarse antes del 4 + 5. La única forma correcta de manejar la precedencia es formar un árbol de evaluación en la memoria, o garantizar que todas las entradas manejen la precedencia de una manera simple y sin ambigüedades (Notación Polaca , Notación polaca inversa, etc.).
Supongo que conoce los problemas de precedencia, pero gracias por permitirme mencionarlo para el beneficio de aquellos que aún no han tenido que escribir ese código.
+1 Similar a mi descripción, pero más corto y bien puesto. –