深入浅析drools中Fact的equality modes
在drools中,我们经常会使用Fact来表示我们的规则中所需要的对象或者数据。在使用Fact的时候,我们需要考虑到Fact的Equality Modes(等值模式)问题。Equality Modes决定了如何比较两个Fact是否相等,进而对整个规则的执行结果产生影响。下面我们详细介绍一下drools中Fact的Equality Modes。
Equality Modes的种类
在drools中,我们有三种Equality Modes:
- STRICT: 严格匹配模式,即只有完全相同的两个Fact才能被认为是相等的。
- EQUALITY: equal模式,即只有规定的单个或多个字段的值相等的两个Fact才能被认为是相等的。
- IDENTITY: 唯一标识模式,即只有两个Fact对象的内存地址相等时才认为是相等的。
Equality Modes的使用
我们可以通过在定义规则时使用注解的方式来设置Fact的Equality Modes方式,例如:
@org.kie.api.definition.type.PropertyReactive(mode = PropertyReactiveMode.EQUALITY)
public class Person {
private String name;
private int age;
// ...
}
上述示例中,我们通过在Person类上使用注解的方式来设置Person使用EQUALITY模式。
EQUALITY模式的示例
接下来,我们举两个EQUALITY模式的示例:
示例1:EQUALITY模式的使用
rule "Person is Over 18"
when
$p1: Person($age1 : age >= 18)
$p2: Person(age == $age1, name != $p1.name)
then
System.out.println($p1.getName() + " and " + $p2.getName() + " are both over 18.");
end
上述规则查找Person集合中年龄在18岁以上的人,同时输出任意两个年龄在18岁以上的人的姓名。因为在定义Person时使用了注解,所以使用了EQUALITY模式。
示例2:STRICT模式下的equal方法被调用
rule "Person is same age and name"
when
$p1: Person($name : name, $age : age)
$p2: Person(name == $name, age == $age)
eval($p1.equals($p2))
then
System.out.println($p1.getName() + " and " + $p2.getName() + " are the same age and have the same name.");
end
上述规则查找Person集合中同名同岁的人,并输出他们的姓名。因为EQUALITY模式无法满足这个需求,所以定义了eval语句,使用STRICT模式下的equal方法实现判断。
总结
本文详细讲解了drools中Fact的Equality Modes,包括其种类和使用方法,并且给出了两个EQUALITY模式的示例。我们需要根据具体的需求选择合适的Equality Modes方式,以保证规则的正确执行。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入浅析drools中Fact的equality modes - Python技术站