2013-05-28 25 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方法後,所有按預期工作。