当使用Drools 5.5 final来比较字符串值字段时,我遇到了一些令人费解的问题。
基本上,我试图找出是否有一对人共用同一个名字。 Person类如下所示:
public class Person {
private String name;
public String getName() { return name; }
public void setName(String n) { this.name = n; }
public Person(String name) { this.name = name;}
}
我尝试触发的规则是:
rule "uniquePersonName"
when
$p1: Person($n1: name)
$p2: Person(this != $p1, name == $n1)
then
System.out.println("Duplicated person name found : " + $n1 + " " + $p2.getName());
end
但它永远不会被触发。但是,如果我将其更改为:
when
$p1: Person($n1: name)
$p2: Person(this != $p1, name != $n1)
系统按预期工作,换句话说,它找到人员名称不同的所有对。
深入挖掘之后,我发现如果我将名称字段更改为Integer类型,原始规则工作正常。这让我觉得这是因为String比较的一些错误。因此,将name字段定义为String类型,我尝试了:
不幸的是,他们都没有工作。
最后,我能让它行为的唯一方法就是将规则写成:
when
$p1: Person($n1: name)
$p2: Person(name == $n1)
eval($p1!=$p2)
这让我觉得这个问题可能是由于“this”如何工作以及如何进行String比较而引起的。
这是非常基本的功能,我很惊讶这是由于Drools 5.5决赛中的一个错误造成的。但同样,我看不到任何方法。你们有人可以帮忙吗?
感谢。
GW
答案 0 :(得分:4)
事实证明“this!= $ p1”转换为!this.equals($ p1),在我的代码中我有一个自动生成的#equals方法(代码未在原帖中显示),这完全改变了默认的比较行为。删除#equals方法后,所有方法都按预期工作。