使用多个ScriptEngines

时间:2015-11-05 23:51:01

标签: java nashorn

我有一个文件夹,可以包含任意数量的脚本作为法术。这些脚本文件中的代码对于大多数脚本来说都是非常小的。

一个简单的法术可能包含:

  • 返回姓名
  • 返回伤害
  • 显示效果
  • 发射/控制射弹

更高级的可能会改变地形或类似的东西。

Spell侧的Java类调用脚本中的强制转换函数。

我想知道的是这样做的不同方式以及他们的优点和做法。利弊。我现在看到这种方式的方法是:在施法时创建一个新的ScriptEngine对象,在它完成时将其销毁。

我认为在现有的ScriptContext上设置一个新的ScriptEngine是不可能的,因为除非我实施某种排队,否则在施放下一个法术之前该法术可能尚未完成施法系统

1 个答案:

答案 0 :(得分:1)

不是每次都创建一个新的脚本引擎,而是每次都维护一个ScriptEngine实例并创建一个新的上下文(使用新的全局变量)。然后在该上下文中评估您的脚本:

ScriptContext context = new SimpleScriptContext();
context.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE);

engine.eval(script, context);

如果你的脚本没有处理全局范围(JavaScript全局范围)中的可变状态,那么你可以简单地创建一个新的上下文并使用引擎的相同全局变量:

ScriptContext engineContext = engine.getContext()

ScriptContext context = new SimpleScriptContext();
context.setBindings(
    engineContext.getBindings(ScriptContext.ENGINE_SCOPE),
    ScriptContext.ENGINE_SCOPE
);

engine.eval(myScript, myContext);