变量在动作上下文(ActionContext)是有生命周期的,变量的生命周期是通过动作上下文的栈实现的。
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中就没有这个变量了。
通过动作上下文的栈的操作,可以实现局部变量和全局变量,方法是引擎在执行动作时总会压入和弹出栈。
如上图的动作,相当于下面的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 版权所有