Drools中使用==与equals()比较字符串的异常问题排查
问题原因解析
这是因为Drools规则语言(DRL)的when条件块与then执行块中==运算符的语义完全不同:
when块中的==是Drools规则语言语法
正如官方文档说明,DRL条件里的==会被引擎转换为值相等比较,等效于java.util.Objects.equals()或字符串的equals()方法,它比较的是字符串的内容而非对象引用。所以在when中用类似Person(name == "John")的写法,能正确匹配内容为"John"的字符串。then块中的==是原生Java运算符then块内的代码是标准Java代码,Java中字符串的==比较的是对象的内存引用,而非内容。只有当两个字符串是内存中的同一个实例(比如字符串常量池里的同一对象)时,==才会返回true。如果req.getPerson().getName()返回的字符串是动态生成的(比如来自数据库、反序列化、动态拼接等),它不会存在于字符串常量池中,和直接写的常量"John"不是同一个引用,因此==会返回false。
你的代码里,equals()方法比较字符串内容所以结果正确,而==在Java代码中做引用比较,自然返回false。
内容的提问来源于stack exchange,提问作者janx
相关产品推荐
相关产品推荐

