Drools入门之declare声明
declare声明在规则引擎中的功能主要有两个:一是声明新类型,二是声明元数据类型。
声明新类型,与JavaBean功能一样,但方式却比JavaBean简单。在之前的讲述过程中,规则中操作事实对象都通过Java代码insert到规则中进行处理。然而有些时候,并非所有的情况都要编辑JavaBean。如果既想使用JavaBean中的特点,又不想多创建JavaBean文件,那么使用声明是再好不过的。
声明元数据类型,fact对象包含了一些特性,这些特性称为类元信息,如需要当前属性长度是固定的,那就在属性声明前添加元数据。一般元数据用于之前讲的查询,复杂事件处理和属性字段约束居多。
声明一个类型
package rules.isDeclare;
dialect "mvel"
declare User
name:String
age:int
end
rule "declare1"
when
then
insert(new User("user1",10))
end
rule "declare2"
when
$u:User(name=="user1")
then
System.out.println("user name is:"+$u.name);
end
public class RulesDeclare {
public static void main(String[] args) {
KieServices kieService = KieServices.Factory.get();
KieContainer kieContainer = kieService.getKieClasspathContainer();
KieSession kieSession = kieContainer.newKieSession("testDeclare");
kieSession.fireAllRules();
kieSession.dispose();
}
}
定义声明属性类型可以是任意的Java有效类型,并且包括用户创建的任何其他类,甚至可以是当前规则中已有的声明类型。比如:
declare User
name:String
age : int
birthday : java.util.Date
end
或者
import java.util.Date
declare User
name:String
age : int
birthday : Date
end
声明一个新事实类型时,Drools会在编译时生成实现表示事实类型的一个Java类的字节码。生成的Java类,将是一个一对一Java Bean类型定义的映射,所以对于前面的例子,生成Java类后,其内容为:
public class User implements Serializable {
private String name;
private java.util.Date birthday;
private int age;
// getters and setters //此处省略这些方法
// equals/hashCode
// toString
}
因为生成的类是一个简单的Java类,相当于在当前规则中import一个对象,所以在同逻辑路径下的规则体中都是可以使用的,与全局变量、函数查询的共享范围是一致的。
继承
声明功能有一个强大的继承功能。其中,关键字extends的继承方式与Java相似,除了上述讲到的基本语法不变外,在声明name后添加extends关键字,并指明要继承的类就可以了。
import java.util.Date
import com.domain.Person
declare PersonChilden extends Person
sex:String
end
rule "declare3"
when
then
PersonChilden personChilden = new PersonChilden();
personChilden.setName("张三");
personChilden.setAge(20);
personChilden.setSex("男");
insert(personChilden)
end
rule "declare4"
when
$p:PersonChilden(name=="张三")
then
System.out.println($p);
end
其中Person类是之前我们文章中用过的类,运行结果如下:
PersonChilden( name=张三, className=null, age=20, sex=男 )
Drools入门之declare声明
https://www.zhaojun.inkhttps://www.zhaojun.ink/archives/drools-ru-men-zhi-declare-sheng-ming