Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Drools:字符串全局变量的奇怪行为_Java_Drools - Fatal编程技术网

Java Drools:字符串全局变量的奇怪行为

Java Drools:字符串全局变量的奇怪行为,java,drools,Java,Drools,情况很简单。我创建了一个规则文件: package org.domain.rules; dialect "mvel" import eu.ohim.fsp.core.configuration.domain.xsd.Section; global java.lang.String sectionName; rule "rule 1" salience 1000 when Section($name : nameOfTheSection) eval(sectionName ==

情况很简单。我创建了一个规则文件:

package org.domain.rules;
dialect "mvel"
import eu.ohim.fsp.core.configuration.domain.xsd.Section;

global java.lang.String sectionName;

rule "rule 1"
salience 1000
when
    Section($name : nameOfTheSection)
    eval(sectionName == null)
then
    System.out.println("Section: " + $name+ "("+$name.length()+")");
    System.out.println("Section Name: " + sectionName + "("+sectionName.length()+")");
    System.out.println("Mark Details: " + sectionName.equals(null));
end
在触发规则之前,我添加了带有有效
coreName
的Section对象和globals:

public void fireInserted(Section section1) {
    kstateful.insert(section1);
    kstateful.setGlobal("sectionName", new String("markudetails"));
    kstateful.fireAllRules();
}
结果是:

Section: markudetails(12)
Section Name: markudetails(12)
Mark Details: false

问题:这怎么可能?在中,当部分为空时,在中,则部分不为空

全局变量不是知识库的一部分,而是将某些上下文推送到规则执行中的单独通道。在
when
子句中使用它们是不合适的。在您的案例中,它是
null
的确切原因可能很难追踪,因为规则激活与规则执行完全解耦。变量可能只是在<代码>子句求值时不绑定,而是在<代码>然后<代码>子句执行时绑定

总而言之:不要在
when
子句中使用globals,这不是globals的用途

您的问题有一个简单的通用解决方案:您可以在知识中插入配置对象。该对象可以具有所需的“sectionName”属性,当时,您可以在
中轻松测试该属性


另一方面,测试
对象.equals(null)
是没有意义的——这永远不会产生
true
。也不需要使用
新字符串(“markudetails”)
。相反,只使用
“markudetails”

全局变量不是知识库的一部分,而是一个单独的通道,用于将某些上下文推送到规则执行中。在
when
子句中使用它们是不合适的。在您的案例中,它是
null
的确切原因可能很难追踪,因为规则激活与规则执行完全解耦。变量可能只是在<代码>子句求值时不绑定,而是在<代码>然后<代码>子句执行时绑定

总而言之:不要在
when
子句中使用globals,这不是globals的用途

您的问题有一个简单的通用解决方案:您可以在知识中插入配置对象。该对象可以具有所需的“sectionName”属性,当
时,您可以在
中轻松测试该属性


另一方面,测试
对象.equals(null)
是没有意义的——这永远不会产生
true
。也不需要使用
新字符串(“markudetails”)
。只需使用
“markudetails”

首先:谢谢!但是,考虑在知识中插入多个部分,在触发规则之前,选择我想在规则中测试的哪个部分。。。怎么做?这就是全局变量sectionName的含义。我没有在注释中回答,而是改进了我的答案。是的,我正在考虑这样做。谢谢首先:谢谢!但是,考虑在知识中插入多个部分,在触发规则之前,选择我想在规则中测试的哪个部分。。。怎么做?这就是全局变量sectionName的含义。我没有在注释中回答,而是改进了我的答案。是的,我正在考虑这样做。谢谢