我目前在我的代码中使用MVEL作为表达式语言,作为简单规则引擎的基础。由于缺乏支持以及相对默默无闻,我们正在考虑将Groovy作为表达语言。
我使用MVEL.eval(表达式,Map args,Class toType)作为主要评估方法,它允许任意参数,而不必进行任何翻译或解释。
Groovy有类似的方法吗?目前我在想的是(如果我错了,请随时纠正我)
我的班级
class GroovyRuleEvaluator implements RuleEvaluator {
private final GroovyShell shell;
private final Binding variableBinding;
public GroovyRuleEvaluator() {
variableBinding = new Binding();
shell = new GroovyShell(variableBinding);
}
@Override
public Object evaluateRule(String expression,Map<String,Object> args) {
args.forEach((name,value) -> variableBinding.setProperty(name,value));
return shell.evaluate(expression);
}
}
但是,根据我从阅读文档以及here的理解,shell的Bindings是共享的,因为我将多次为不同的表达式和参数调用evaluateRule(),这会导致错误,因为较旧的绑定可以保留。
评估规则后是否有正确的方法来删除绑定?