变量范围

     变量在动作上下文(ActionContext)是有生命周期的,变量的生命周期是通过动作上下文的栈实现的。

1.动作上下文栈操作

import org.xmeta.ActionContext;
import org.xmeta.Bindings;

ActionContext actionContext = new ActionContext();

//获取最上面的栈
actionContext.peek().put("x", 1);
System.out.println(actionContext.get("x")); //打印结果是1

//压入一个栈,出栈(pop)要一一对应
try{   
    Bindings bindings = actionContext.push();
    bindings.put("x", 2);
    System.out.println(actionContext.get('x")); //打印结果是2

    //再压入一个栈,出栈(pop)要一一对应
    try{
        Bindings bindings = actionContext.push();
        bindings.put("x", 3);
        System.out.println(actionContext.get('x")); //打印结果是3
    }finally{
        actionContext.pop();
        System.out.println(actionContext.get('x")); //打印结果是2
    }
}finally{
     actionContext.pop();
     System.out.println(actionContext.get("x")); //打印结果是1
}

     在上面的代码中,ActionContext也是一个栈,这个栈中的元素是Bindings,Bindings中可以保存变量。当从ActionContext取值时,是从变量最顶层往下去变量,当一个Bindings中含有变量时就返回,否则会一直取到栈的最底层。当一个Bindings被移除(pop)时,Bindings中的变量也跟着一并被移除了,此时ActionContext中就没有这个变量了。

2.局部变量和全局变量

    通过动作上下文的栈的操作,可以实现局部变量和全局变量,方法是引擎在执行动作时总会压入和弹出栈。

    如上图的动作,相当于下面的Java代码。

public void TestScope(){
    int x = 100;
    int y = 200;
    {   //Begin
        int z = 300;   //在Variables节点下定义
        {   //第二个Begin
                System.out.println(x + y + z);
        }
    }
}

    而模型中x、y和z变量的生命周期和Java代码中的x、y和z变量的生命周期是一样的,其中在动作的截图中蓝色的节点是局部变量的节点,对应于Java代码中的括号{}。

    在动作上下文中,最底层的一个栈层总是不会被移除,所以相对来说保存在这个层的变量就是全局变量了。

 

Copyright ©  2007-2014 XWorker.org  版权所有

沪ICP备08000575号