2012-06-27 2 views
1

상황이 쉽습니다. 나는 규칙 파일 생성 :Drools : String 전역 변수의 이상한 동작

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와 섹션 객체와 전역 추가 :

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 

질문을 : 어떻게 가능할까요? 부분이 null이고 인 경우 부분이 null이 아닙니다!

답변

4

글로벌 변수는 지식 기반의 일부가 아니며, 일부 컨텍스트를 규칙 실행으로 밀어 넣기위한 별도의 채널입니다. when 절에 사용하는 것은 적절하지 않습니다. 규칙 활성화가 규칙 실행과 완전히 분리되어 있기 때문에 귀하의 경우 정확히 null이라는 정확한 이유를 추적하기 어려울 수 있습니다. 변수는 when 절 평가 시간에 바인딩되지 않을 수도 있지만 then 절 실행 시간에 바인딩됩니다.

요약 : when 절에서 전역 변수를 사용하지 마십시오.

문제는 쉬운 해결책이 있습니다. 구성 개체를 지식에 삽입 할 수 있습니다. 해당 객체는 원하는 "sectionName"속성을 가질 수 있으며이 속성은 when에서 쉽게 테스트 할 수 있습니다.

제쳐두고, object.equals(null)을 테스트하는 것은 의미가 없습니다. 이것은 결코 true을 생성 할 수 없습니다. new String("markudetails")을 사용할 필요가 없습니다. 대신 "markudetails" 만 사용하십시오.

+0

우선 : 감사합니다. 그러나 지식을 하나 이상의 섹션에 삽입하는 것에 대해 생각해보십시오. 규칙을 실행하기 전에 규칙에서 테스트 할 섹션을 선택하십시오. 어떻게 수행합니까? 이것이 전역 변수 sectionName의 의미입니다. –

+0

코멘트에 대답하는 대신, 나는 나의 대답을 향상시켰다. –

+0

네, 그 일을 생각하고있었습니다. 감사! –