有没有更好的方法来定义关注规则?
遵循规则检查以查看某人是否超重(通过调用Weight类中定义的greaterThan方法)。
规则:
rule "OverWeightTest"
dialect "mvel"
when
$person : Person(weight.greaterThan(new Weight(200, Weight.Unit.LBS)) )
then
System.out.println($person + " is overweight!");
end
Java类:
public class Person
{
private final String name;
private final Weight weight;
}
public class Weight
{
private final int value;
private final Unit unit;
public boolean greaterThan(final Weight otherWeight) {
...
}
}
谢谢!
答案 0 :(得分:1)
您无法在DRL代码中为类似静态的变量实例化对象。从技术上讲,你可以在一个规则中初始化一个全局(具有最大显着性),但这对于推理引擎来说太晚了,因为在那时它将会运行,并且不会考虑全局变量。
因此,最好的选择是在Weight类中使用静态工厂方法。 最好不要在LHS代码中调用构造函数。
class Weight {
public static lbs(int amt ){
return new Weight(amt, Weight.Unit.LBS);
}
}
并在您使用的规则中
Person( weight.greaterThan(Weight.lbs(200)) )
这可以有利地与生成的对象的静态缓存组合。
实现Comparable并不会使它更具可读性(尽管它可能对您的Java代码有用)。
答案 1 :(得分:1)
即使@ Laune的答案是最干净的并遵循所有最佳实践,我将留下这种替代方式,你必须在规则的LHS中实例化对象(可能是因为构造函数中的一些必要参数来自一个绑定到事实的变量。)
rule "OverWeightTest"
dialect "mvel"
when
$w: Weight() from new Weight(200, Weight.Unit.LBS)
$person : Person( weight.greaterThan($w) )
then
System.out.println($person + " is overweight!");
end
同样,我同意上述规则将被生产规则系统纯粹主义者视为不圣洁的怪物!
希望它有所帮助,