变量在动作上下文(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 版权所有