Мы можем пересмотреть это, чтобы сделать простой движок
public interface Function<T> {
T operate(Map<String,T> values);
}
public class Calculation<T> {
private Map<String,T> values;
private Function<T> function;
public Calculation(Map<String,T> values, Function<T> function) {
this.values = new HashMap<String,T>(values);
this.function = function;
}
public T calculate() {
return function.operate(Collections.unmodifiableMap(values));
}
// assume setters and getters are in place to manipulate the backing map and the functor object
}
Имея это, мы можем определять различные функции и вычисления
public static void main(String[] args) {
Function<Integer> original = new Function<Integer>() {
public Integer operate(Map<String,Integer> values) {
// these will throw exceptions if they don't exist, which is desired
// granted it's NullPointerException instead of IllegalStateException, but close enough for this example
int age = values.get("age").intValue();
int height = values.get("height").intValue();
int fights = values.get("fights").intValue();
return (age+height)*fights;
}
};
Map<String,Integer> map = new Map<String,Integer>();
map.put("age",10);
map.put("height",100);
map.put("fights",25);
Calculation<Integer> calc = new Calculation<Integer>(map,original);
// later someone can replace either the values in the backing map
// or replace the function altogether to get a new function
}
Проблема возникает, когда вы пытаетесь сделатьэто не только пользователь, но и пользователь.Например, пользователь может определить функцию как одну из набора функций, которые вы предварительно ввели.В этом случае вам понадобится парсер, который превращает что-то вроде этого:
value + (other + (something * that)) / wazook
в следующее:
EquationBuilder<Integer> eb = new EquationBuilder<Integer>();
eb.append(map.get("value"));
eb.append(OPERATOR.PLUS);
// etc
return eb.evaluate();
Но это может выходить за рамки вашего задания.Или, может быть, это не так.
Надеюсь, это немного ближе к вашим требованиям, чем мой предыдущий пример.