嗯,完全天真的尝试:
public interface Condition<Type T> {
public boolean process(T object);
}
ArrayList row = new ArrayList<Condition>(10);
row.add(new Condition<YourObject>() {
public boolean process(YourObject obj) {
if (obj.property > 0) return true;
else return false;
});
row.add(new Condition<YourObject>() {
public boolean process(YourObject obj) {
if (obj.property2 == 100) return true;
else return false;
});
,那么你会遍历:
for (Condition<YourObject> cond : row) {
if (! cond.process(yourobj)) break;
}
一个稍微复杂的例子,你可以写你的决定表中的javascript很多更简洁,也许使用Beanshell来执行逻辑。在我可以发布你的例子之前,我将不得不击中一下这个外壳。
,或者它可能的,如果你发布了一个例子有人能想出一些简单的Scala程序做你想要什么。
编辑:
所以我做了一些研究和思考,并为您的BeanShell可以使用像这样:
import bsh.Interpreter;
Interpreter i = new Interpreter(); // Construct an interpreter
YourObject yourObject = new YourObject();
i.set("myObject", yourObject);
// Source an external script file
i.source("somefile.bsh");
而且somefile.bsh可能是这样的:
var rules = new Array();
rules.push(function(var) {
if (var.getProperty() == 0) return true;
else return false;
});
rules.push(function(var) {
if (var.getProperty() < 1000) return true;
else return false;
});
... more rules ...
for (var func in rules) {
if (!func(myObject)) break;
}
这会给你更多的灵活性来改变规则,而不是重新编译Java源代码。
你将不得不另一个阵列添加到这些解决方案,让您的100源“行”
哇,谢谢克里斯。我认为我可以用这个做点什么...我会给它一个旋转。 – Elwood 2011-05-04 21:12:01