同一输入下Drools命名结果规则输出不一致问题排查
问题原因解析
本质是Java字符串的字面量常量池机制导致的差异:
- 手动创建Cat实体时,给
nickName赋值的是字符串字面量"bar",Java会将这类字面量存入字符串常量池,此时用==比较的是常量池中的同一引用,结果为true,因此触发了命名规则(Named consequence)。 - 通过
/automatic接口接收请求体转换实体时,JSON解析框架会创建新的字符串对象,这些对象不会存入常量池,==对比的是两个不同对象的内存地址,结果为false,所以nickName == "bar"条件不成立,命名规则未触发,仅执行了基础规则。
- 手动创建Cat实体时,给
改用
equals能解决问题的原因:
Java中String.equals()方法专门用于对比字符串内容,无论对象是否在常量池中,只要内容一致就返回true,替换后两种场景都能正确匹配规则。重要提醒:
编写Java代码时,绝对不要用==对比字符串内容,尤其是处理外部输入(如接口请求、数据库数据)时,必须使用equals()或者Objects.equals()(可避免空指针异常)来做内容对比。
内容的提问来源于stack exchange,提问作者Vishesh Mukherjee
相关产品推荐
相关产品推荐

