嗯,一个完全幼稚的尝试:
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 个源“行”