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
作者
卑微幻想家
发布于
2022-07-03
许可协议