si può provare il seguente codice. E 'object oriented, piuttosto generica, e si può facilmente estendere per aggiungere nuovi operatori, compresi gli operatori con un diverso numero di argomenti:
public abstract class Operator {
public abstract Integer compute(Integer...values);
}
public class Plus extends Operator {
public Integer compute(Integer...values) {
return values[0] + values[1];
}
}
public class Minus extends Operator {
public Integer compute(Integer...values) {
return values[0] - values[1];
}
}
public class Multiply extends Operator {
public Integer compute(Integer...values) {
return values[0] * values[1];
}
}
public class Divide extends Operator {
public Integer compute(Integer...values) {
return values[0]/values[1];
}
}
Map operatorMap = createOperatorMap();
public Map createOperatorMap() {
Map<String, Operator> map = new HashMap<String, Operator>();
map.put("+", new Plus());
map.put("-", new Minus());
map.put("*", new Multiply());
map.put("/", new Divide());
return map;
}
public int compute(int a, int b, String opString) {
Operator op = operatorMap.get(opString);
if (op == null)
throw new IllegalArgumentException("Unknown operator");
return op.compute(a, b);
}
lol non sapeva che potresti importare il motore javascript: D per la seconda opzione: so perfettamente che potrei usare un interruttore (o un if ...) volevo un metodo più "elegante" – dynamic
puoi implementare un pattern Interpreter ma forse è eccessivo per quello che vuoi. C'è un video di GoogleIO da qualche parte sul refactoring di un problema come il tuo. non riesco a ricordare il nome :( – Mauricio
come si può restituire questo: return =; return ||; return +;? – delive