俳優のクリストファー・ウォーケンは以前サタデー・ナイト・ライブで寸劇を演じ、その中で、「自分の熱を下げるにはカウベルがもっとたくさん必要だ」と声高に語っていた(リンク)。それとおなじように「開発をもっとグルービーに」と語る人々の声を、Groovy チームははっきりと聞き、彼らの開発する受賞経験もある言語 Groovy のバージョン 1.6 をリリースした(リンク)。リリースページには以下のとおり (リンク) 、たくさんの新機能について記載されている。
- 実行時パフォーマンスの大幅な改善
- 多重代入および、if/else や try/catch ブロックにおける return の省略
- AST 変換と、@Singleton、@Lazy、@Immutable、@Delegate などの変換アノテーションの提供
- Grape モジュール、依存関係管理システム、@Grab 変換アノテーション
- Swing ビルダのさまざまな改良(Swing / Griffon チームに感謝したいhttp://griffon.codehaus.org)
- Swing コンソールもいくつか改良
- JMX ビルダの統合
- JSR-223 スクリプティングエンジンのビルトイン
- EMC DSL、POJO にもインスタンスごとのメタクラスを実現、実行時のミックスインといった、メタプログラミング機能のさまざまな改良
今回のリリースの目玉のひとつはパフォーマンスである。Groovy チームは 150 %~ 460 %にもおよぶ劇的な改善を実現したと主張している(リンク)。その他の機能としては、JMX ビルダ(リンク)の公式な統合がある。これは、コミュニティの努力が Groovy の改善に貢献したもうひとつの例だ。
以下は、多重代入や AST 変換など新機能のいくつかを使ったサンプルである。
// このクラスのプロパティは一旦オブジェクトが生成されると変更できない
@Immutable final class ServerConfig {
String url
int port
}
def getServerInfo() {
['http://home.net', 8080]
}
// Immutable(変更不可能)なオブジェクトにプロパティをセットしようとするメソッド
def setUrl(config, newUrl) {
try {
config.url = newUrl
}
catch (ReadOnlyPropertyException ex) {
ex
}
}
//多重代入
def (url, port) = getServerInfo()
assert url == 'http://home.net'
assert port == 8080
def config = new ServerConfig(url, port)
assert config.url == url
assert config.port == port
// Immutable(変更不可能) なオブジェクトのプロパティを変更しようとするメソッドを呼び出す
def result = setUrl(config, 'www.google.com')
// プロパティの変更が失敗したことを確認する
assert result instanceof ReadOnlyPropertyException
上記の例は、 @Immutable AST 変換をつかえば書込み禁止オブジェクトをどれほど簡単に作成できるかを示してくれる。また、この例は新たに導入された多重代入機能のつかい方も実演してくれている。AST 変換(リンク)についてもっと知りたい方は、Groovy ユーザガイドを見てほしい(今のところ @Immutable 変換しかカバーしてないが)。
この記事では Groovy 1.6 が提供する機能の概観をざっと眺めたので、次は Groovy プロジェクトのマネージャである Guillaume LaForge 氏が InfoQ に書いた、Groovy について掘り下げた記事「Groovy 1.6 の新機能(参考記事・英語)」をチェックしてほしい。Guillaume 氏は新機能それぞれをカバーし、それらの機能のすべてを知る手助けとなる多くのコード例を提示してくれている。