2011-11-21 14 views
5

मुझे एक नियम लिखने में कठिनाइयों का सामना करना पड़ रहा है जो इसके एलएचएस में एनम मूल्य के साथ मेल खाता है।डोलॉल्स: नियम के एलएचएस में एनम का उपयोग कैसे करें?

उदाहरण के लिए, अगर मैं निम्नलिखित enum है:

public enum EStatus { 
    OK, 
    NOT_OK 
} 

मैं कुछ इस तरह में इसका उपयोग करना चाहते हैं:

rule "my rule" 
dialect "java" 
    when   
     status : EStatus()      // --> this works, but I want to be more specific 
     // status : EStatus(this == EStatus.OK) // --> doesn't work. How can I make it work? 
    then 
     // ... 
end 

इस भी संभव Drools में है? मैं संस्करण 5.1.1 का उपयोग करता हूं।

उत्तर

6

यह मेरे लिए काम करता है:

rule "my rule" 
when 
    Ticket(status == EStatus.OK) 
then 
    ... 
end 

ताकि भी काम करना चाहिए:

rule "my rule" 
when 
    EStatus(this == EStatus.OK) 
then 
    ... 
end 

सत्यापित करें यदि यह अभी भी Drools 5.3 में होता है और अगर यह jira

+0

धन्यवाद के रूप में नियम लिख सकते हैं। अब यह मेरे लिए भी काम करता है। यह अजीब बात है, क्योंकि मैंने इसे पोस्ट करने से पहले इस मुद्दे को कई बार सत्यापित किया था। सबसे संभावित कुछ फिसल गया ... – Calin

0

में करता है पर बग के मैंने एलएचएस [टिकट (स्थिति == ईस्टैटस.ओके) पर एनम का उपयोग करने की कोशिश की], मुझे कुछ समय संकलित समय त्रुटि मिलती है:

BuildError: सख्त-मोड का उपयोग विधि हल करने में असमर्थ: == अभिव्यक्ति स्थिति का विश्लेषण करने EStatus.OK त्रुटि असमर्थ ....

समाधान:

नियम एलएचएस में, हम तुलना करने के लिए है एक स्थिर मूल्य के साथ ... उदाहरण के लिए: उपयोगकर्ता: उपयोगकर्ता (आयु> 60) - यहां हम निरंतर मूल्य 60 के साथ उम्र की तुलना कर रहे हैं।

तो एनम, टिकट (स्थिति == EStatus.OK) का उपयोग करने के लिए ... स्थिति के साथ इसकी तुलना करने के लिए मुझे EStatus.OK के स्थान पर कुछ स्थिरता का उपयोग करना पड़ा। इस कारण से, मैंने एनम में एक स्थिर विधि का उपयोग किया।

तो, शासन के एलएचएस अब की तरह दिखता है: टिकट (स्थिति == EStatus.getEStatus (1))

और EStatus enum निम्नलिखित की तरह है:

सार्वजनिक enum EStatus {

// you can use values other than int also 
OK(1), 
ERROR(2); 

private int value; 

ईस्टैटस (int संख्या) { यह .value = संख्या; }

public int valueOf() 
{ 
    return this.value; 
} 

public static EStatus getEStatus(int value){ 
    EStatus eStatus = null; 

    for(EStatus e : EStatus.values()){ 
     if(e.valueOf() == value){ 
      eStatus = d; 
      break; 
     } 
    } 

    return eStatus; 
} 

}

मैं इस JDK का उपयोग कर 1.6 और दोनों लिनक्स और विंडोज वातावरण में परीक्षण किया है।

कोडिंग का आनंद लें!

0

एक और समाधान। आपको बस एनाटस एनम में गेटटर जोड़ने की जरूरत है।

public enum EStatus { 
OK, 
NOT_OK; 

public EStatus getValue(){ 
    return this; 
} 

}

तो फिर तुम यह उनका कहना है के लिए नीचे दिए गए

rule "my rule" 
when 
    EStatus(value == EStatus.OK) 
then 
    ... 
end 
संबंधित मुद्दे