3

在使用 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)

该系统按预期工作,换句话说,它会找到所有具有不同姓名的人的配对。

深入挖掘后,我发现如果我将 name 字段更改为 Integer 类型,则原始规则可以正常工作。这让我觉得这是因为字符串比较的一些错误。因此,将 name 字段定义为 String 类型,我尝试了:

  1. not (name == $n1)
  2. (name == $n1)
  3. name.toString() = $n1.toString()
  4. name == $p1.getName()

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

最后,我可以让它表现的唯一方法是将规则编写为:

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

这让我觉得问题可能是由如何this 工作和如何完成字符串比较引起的。

这是非常基本的功能,我会很惊讶这是由 Drools 5.5 final 中的错误引起的。但同样,我看不到一条路。你们中的任何人都可以帮忙吗?

谢谢。

GW

4

1 回答 1

5

事实证明this != $p1转换到!this.equals($p1)引擎盖下,在我的代码中,我有一个自动生成的equals方法(原始帖子中未显示代码),它完全改变了默认比较行为。删除该equals方法后,一切都按预期工作。

于 2013-05-30T23:55:34.363 回答