嗯,完全天真的嘗試:
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