Groovy1.7.4及1.8-beta-1问世

Groovy1.7.4及1.8-beta-1几天前已经发布,其中1.8-beta-1多了不少新特性。

Groovy1.7.4修改了使用GroovyScriptEngine自动重装载、联合编译(joint compiler——该机制确保Groovy和Java可以无缝集成)及Enums语法问题等若干问题;新增了File.renameTo(String fileName)方法,set的减法及交集,并可在console中编译脚本。

Groovy 1.8-beta-1增加了许多新特性:

  • 闭包现在是“callable”(继承java.util.concurrent.Callable)
  • 增加许多新的AST变换
    • @Log 在类中注入logger
    • @ScriptField 在脚本中创建属性
    • @PackageScope 原先只能用于field,现在对method和class也可用
    • @Synchronized 提供更安全的同步语义
    • @InheritConstructors 继承构造器
    • @IndexedProperties 增加JavaBean带索引的属性(indexed property)
    • @AutoClone 支持bean自动克隆
    • @AutoExternalize 自动外化(externalization)POGO
    • @Canonical 加入适当的equals()、hashCode()、toString()方法
    • @EqualsAndHashCode 加入适当的equals()、hashCode()方法
    • @ToString 创建默认toString()方法
    • @TupleConstructor 加入元组构造器(tuple constructor)
  • 新增字符串语法$/.../$,忽略其中的各种转移字符,如$/a/b\c$$ $//$表示字符串a/b\c$$ $/(我个人非常喜欢这个特性)
  • 新增一些GDK方法,如:Map.countBy{},Map.collectEntries{},Date.putAt()(下标操作),Date.updated()
  • 其他改进
    • 新字符串方法:tr(), stripMargin(), stripIndent(), (un)expand(),
    • Map的withDefault{}
    • 闭包的ncury()和rcury()
    • Sql的withBatch{}和withTransaction{}

在Groovy 1.8中,将允许闭包作为注解参数使用(为了兼容,其实际被转换为一个类参数)。关于这一特性,本站点相关文章已有涉及:“用闭包增强注解”,只不过在那篇文章里,这一特性是spock提供的。当然,既然Groovy 1.8要直接支持这一特性,使用起来就没那么麻烦了。Groovy 1.8最终版预计年底发行。

关于这两个版本的更多内容,请参见以下资源:

By songwei - Posted on 27 七月 2010

GroovyScriptEngine

GroovyScriptEngine  是不是只支持Groovy语言脚本。。不支持其他语言脚本?

ScriptEngine是支持的。 

选择哪个得看你的需求

ScriptEngine和GroovyScriptEngine的关系就像是JDBC规范和各数据库厂商的JDBC实现一样,虽然GroovyScriptEngine不是直接实现ScriptEngine接口。前者只是规范,不是实现,后者是针对Groovy的实现。

Groovy已经有兼容jsr 223的实现,因此,只要你严格按照ScriptEngine的接口来,理论上,你可以动态的去使用各种脚本,如一会儿用Groovy,一会儿去用Scala,无非就是换一下要创建的脚本名字(如:ScriptEngine engine = factory.getEngineByName("groovy");),以及要计算的脚本字符串(如:engine.eval("(1..10).sum()"))。但前提是,你仍需要各种脚本的实现,而不是只有一个ScriptEngine就行了的。这个跟JDBC一样,你完全可以在程序中既去连Oracle,也可以去连MySQL,但需要包含这两个数据库的JDBC Driver。

这个URL,http://groovy.codehaus.org/JSR+223+Scripting+with+Groovy,已经很好的解释了这一点。注意文中的最后一句话:

Groovy有很多针对Java集成的机制,其中有些提供了比 JSR 223更丰富的选择(例如,更好的可配置性和更多的安全控制)。当你需要保持所用语言选择的灵活性,同时你不需要该规范不支持的集成机制时,推荐使用JSR 223。

直接使用Groovy,不是像上文中那样去通过ScriptEngine去eval,除了方便,还让你感觉开发过程不是割裂的。只有在程序开发完成之后,有可能需要动态去改变一些东西的情况下,我才会去考虑使用这种方法。典型的如一些规则书写,完全可以使用Groovy来定义,之后保存到数据库或其他地方。使用时动态加载计算。

所以,这些全都在于你自己需要怎么去用它,而不是说单纯的只看一点。

用途写脚本测试工具,支持多脚本语言

恩,我听懂你的意思了,非常感谢你的阐释。

看了一早上的groovy api  也没看到。Groovy 脚本调用因为是很简单,很方便。这个点上它的集成的机制只实现了自己的GroovyScriptEngine,对于它的优越性,我觉得它可以去实现其他脚本机制,毕竟它也是语言。  (发牢骚)   我是这样想的。

用途写脚本测试工具,支持多脚本语言   对于这个需求,我看样子不得不回归到Java里了。你说对吗?

应该差不多吧,呵呵

应该差不多吧,呵呵