2013-05-28 23 views
2

当使用Drools 5.5 final来比较字符串值字段时,我有一些令人费解的问题。比较流水线中的字符串值字段5.5

基本上,我试图找出是否有一对人共用同一个名字。 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比较的一些错误。因此,与定义为String类型的姓名字段,我想:

  1. 没有(名称== $ N1)
  2. (名称== $ N1)
  3. name.toString()= $ N1。的toString()
  4. 名== $ p1.getName()

不幸的是,他们没有工作。

最后,我能得到它的行为的唯一方法就是写的规则:

when 
    $p1: Person($n1: name) 
    $p2: Person(name == $n1) 
    eval($p1!=$p2) 

这使我想到也许问题是如何“这个”的作品,以及如何字符串比较的组合引起已经完成了。

这是非常基本的功能,我会惊讶这是由Drools 5.5 final中的错误引起的。但是,我再也看不到一条路了。你们能帮忙吗?

谢谢。

GW

回答

3

原来“这个!= $ P1”转变为!this.equals($ P1)的引擎盖下,在我的代码,我有一个自动生成的#equals方法(代码未显示在原来的文章),这完全改变了默认的比较行为。删除#equals方法后,所有按预期工作。