我在编写与lhs中的enum值匹配的规则时遇到了困难。
例如,如果我有以下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版本
这个适合我:
rule "my rule"
when
Ticket(status == EStatus.OK)
then
...
end
这样也可以了:
rule "my rule"
when
EStatus(this == EStatus.OK)
then
...
end
验证它是否仍然在Drools 5.3中发生,如果在jira中发生,则提交一个错误
我尝试在LHS上使用Enum [Ticket(status == EStatus.OK)],我得到编译时错误如下:
BuildError: cannot to analyze Expression status == EStatus。好吧错误:无法使用严格模式解析方法:....
解决方案:
在LHS规则中,我们必须与一个常量值进行比较…例如:user: user (age> 60) -这里我们将age与常量值60进行比较。
所以对于使用Enum, Ticket(status == EStatus.OK)…我必须用一些常数来代替EStatus。把这个和状态比较一下。因此,我在Enum中使用了一个静态方法。
因此,规则的LHS现在看起来像:Ticket(status == EStatus.getEStatus(1))
和状态枚举如下:
public enum状态{
// you can use values other than int also
OK(1),
ERROR(2);
private int value;
EStatus (int数){这一点。Value = number;}
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;
}
}
我已经在Linux和Windows环境下使用jdk 1.6进行了测试。
享受编码!
另一个解决方案。您只需要在Estatus enum中添加getter,如下所示。
public enum EStatus {
OK,
NOT_OK;
public EStatus getValue(){
return this;
}
}
那么你可以写规则如下
rule "my rule"
when
EStatus(value == EStatus.OK)
then
...
end
这也应该有效果:
rule "my rule"
when
$status : EStatus()
eval ( $status == EStatus.OK )
then
...
end