Skip to end of metadata
Go to start of metadata

このノートの対象

Icon

下記のリリースノートは、最新のメジャーリリースであるGroovy 1.7の新機能を対象にしたものです。

IDEサポート


Groovy 1.7の新機能の紹介に入る前に、Groovy(Griffon, Gradle, Gant, Grails等も含む)のIDEサポートの大きな前進について述べさせてください。主要なIDEすべて(Eclipse, IntelliJ IDEA, NetBeans)が、素晴らしいレベルの言語サポートを提供します。当初は最も欠けていたEclipseのサポートも、SpringSourceのEclipseチームの努力の結果、今ではクロス言語リファクタリング、Groovy固有コード補完など、Java/Groovy混在アプリケーションの開発のための優れた環境を持つことができました。

新しく改良されたEclipseプラグイン

Icon

M1リリースM2リリースのノートを含む、Eclipseサポートについての詳しい情報は、Groovy Eclipseプラグインのホームページをご覧ください。

新機能

匿名内部クラスとネストクラス


クロージャやマップからの変換で十分な場合も多いとはいえ、匿名内部クラス(AIC)やネストクラス(NC)の欠如が問題になる場合もまだあります。これが、Groovy 1.7でついにAICやNCを実装すると決めた理由です。

注意!

Icon

AICとNCの実装は、Javaのものに従ってはいますが、Java言語仕様を持ち出して相違点を並べ立てるようなことはしないでください。この実装はgroovy.lang.Closureの実装に近く、いくつかの利点と相違点があります。例えば、プライベートフィールドやメソッドへのアクセスは問題を起こす可能性があり、また一方でローカル変数はfinalでなくてもかまいません。

staticなネストクラス


以下はstaticなネストクラスの例です:


staticなネストクラスの使用は最もよくサポートされています。もしどうしても内部クラスが必要なのであれば、staticなものにするべきです。

匿名内部クラス


その他の例として、匿名内部クラスを示します:

さらに詳しい情報

Icon

1.7で現在サポートされているケースについてもう少し詳しく知りたい場合は、この新機能が対象になっているユニットテストを眺めてみることもできます。

ネストクラスから外部コンテキストへのアクセス


Xというクラスに囲まれたネストクラスYの中で、JavaではXの変数vに X.this.v でアクセスできます。Groovyではこの構文をサポートしていません。

非staticな内部クラスのインスタンス生成


Javaでは次のようにできます:


ネストクラスXは、外側のクラスYのインスタンスへの参照が必要であることに注意しましょう。このJavaの例では、1番目のパラメータとしてYをとるコンストラクタがXの中に生成されます。このコンストラクタは自動生成されるもので、コード上には一切現れません。
メソッドfoo()の中のnew X()のような場合、コンパイラは替わりにnew X(this)を生成します。createXの場合にはコンパイラはnew X(y)を生成します。Groovyではこれはサポートされていません。


その替わりにGroovyでは、コンパイラがするようにインスタンスを渡すことになります。つまり、上のコードは次のように書き直す必要があります:

注意事項

Icon

しかしGroovyでは、引数を与えずにパラメータ1個のメソッドを呼び出すことができてしまうことに注意してください。このときパラメータの値はnullになります。コンストラクタ呼び出しにも基本的には同じルールが適用されるので、例えばnew X(this)のかわりにnew X()と書いてしまう恐れがあります。これは通常の使い方でもある可能性もあるため、この問題を防ぐよい方法はまだ見つかっていません。

アノテーション


Groovyでのアノテーションのサポートは、Java 5におけるアノテーションと同一です。しかし私たちは、通常の位置(型、フィールド、メソッド、パラメータ等)以外の場所にもアノテーションを置けると便利かもしれない、と考えました。例えば、Javaではimportやpackage文にアノテーションを付けることはできません。Groovyはこの制限を超越し、importやpackage文、そして変数宣言へのアノテーションのサポートを追加しています。この拡張されたアノテーションの利用例は、Grapeで見ることができます。

Grape


Grape依存関係管理システムによって、ダウンロードやパッケージング、クラスパス指定などを自分で扱う必要なく、スクリプトが依存関係をリクエストすることが可能になりました。Grapeを使うためには、@Grabアノテーションを使ってリポジトリ(例えばMavenのセントラルリポジトリ)から依存モジュールを取り込む(grabする)必要がありました。アノテーションはいくつかの許された要素、つまりJavaでアノテーションを置ける場所にしか付けられないという問題がありました。しかし、今ではimportにもアノテーションを付けることができます:


変数宣言に@Grabを付ける別の例です:

ノート

Icon

この例での@Grabアノテーションの改良点に注目してください。前の例でのより冗長な指定方法に加えて、依存関係を表すパラメータとして単一のStringを取る短縮版が提供されています。単純にグループ、モジュール、バージョン指定子をコロンで連結するだけです。

Grape リゾルバ が追加され、grapeのダウンロード元になるリモートロケーションを指定できるようになりました:

パワーアサート


Groovyの"assert"キーワードは、与えられた式が単にtrueかfalseかだけをチェックするという、ある意味限定的なその機能を批判されることがありました。より読みやすく説明的なメッセージを出力するJUnit/TestNGのようなテストフレームワークや、様々な拡張アサーションユーティリティとは異なり、Groovyのassertは、単にその式がfalseであることと、式の中の変数の値を教えてくれるだけでした。パワーアサート(元々はSpockフレームワーク開発の成果物)によってassertの出力は大きく改善され、assert式の各部分式の値のビジュアルな表現を提供するようになりました。例えば:


これは下記を出力します:

AST


Groovy 1.6でAST変換が導入され、バイトコードへの変換前にAbstract Syntax Tree(抽象構文木)を変更することで、開発者がコンパイル時にメタプログラミングを行うことが可能になりました。Groovy 1.6ではさまざまな変換、特にアノテーションによって起動される「ローカル」変換(@Delegate, @Singleton, @Bindableなどのような)が追加されました。この機能は強力ですが、AST変換を書くのはいつも退屈な仕事でした。Groovy 1.7では、AST変換を書く人の作業を助ける二つの新機能、ASTビューアとASTビルダが導入されています。

ASTビューア


下のスクリーンショットは、GroovyConsoleから起動できる新しいウィンドウです。コンソールで編集中のスクリプト(例えば自作のAST変換で生成したいコードなど)のASTをビジュアル化することができます。ASTビューアを使って、コンパイル時にGroovyがどんなASTを構築しているかを調べることは大きな助けになるでしょう。

ASTビルダ


ASTのビジュアル化も大切ですが、ASTをもっと簡単に生成したり変更したりするメカニズムも必要です。ASTビルダの導入によって、ASTを扱う三種類のアプローチが利用できるようになり、AST変換の作成がより簡単になります:

  • 文字列から構築
  • コードから構築
  • 仕様から構築


ASTビルダ以前は、さまざまなASTノードのすべてを手動で作成/インスタンス化する必要がありました。三つのそれぞれのやり方がこの作業をどう助けるのか、文字列定数を表すノードを生成する例を見てみましょう。

文字列から構築

コードから構築

仕様から構築

さらに詳しい情報

Icon

ASTビルダのドキュメントにぜひ目を通してみてください。それぞれのやり方の利点や欠点、そしてなぜこの三つのやり方すべてが必要なのか(ASTで実現したいこと次第なのです)がわかるでしょう。

その他の小さな改良点

Groovy Truthがカスタマイズ可能に


Groovyでは、true/falseとして評価されうるのはbooleanだけではありません。例えば、null、空の文字列やコレクションはfalse、長さが1以上や空でないものはtrueと評価されます。この真偽判定が『Groovy in Action』本での"Groovy Truth"(訳注:日本語版では「Groovyでの真偽判定」)という造語になりました。Groovy Truthを使えば、ありがちなnullチェックを省いて、次のようにシンプルに書けます:


Groovy 1.7以前は、一部の少数のクラスだけがboolean値への特別な変換方法を持っていました。しかし今では、自作のクラスでもbooleanへの変換用のメソッドを提供することができます。例えば、以下のPredicateクラスでは、boolean asBoolen()メソッドを実装することで、Predicateインスタンスのtrue/falseへの変換機能を実現しています:


カテゴリやExpandoMetaClassを使って、asBoolean()メソッドを注入したり、既存のもの(特別なGroovy Truthの振る舞いを持つ一部のクラスのものでさえも)をオーバーライドすることも可能です。

依存関係の更新


Groovyが依存しているモジュールのうちいくつかが、より新しいバージョンにアップグレードされました。

例えば、Groovyは"invokedynamic"に対応した最新バージョンのASMを使うようになったので、JSR-292 / invokedynamicへの対応を進める準備は整っています。また、Grape依存関係モジュールで使われているIvyも最新バージョンを使っています。

書き直されたGroovyScriptEngine


GroovyScriptEngine(Groovletでも使われています)は、様々な依存性の問題を解決するために書き直され、その結果、全体的にかなり高速になりました。

新しいロジックでは、依存関係を追跡するために追加のフェーズオペレーションを使っています。その結果、エラーを起こしがちだった追跡のためのクラスローダテクニックを排除できました。このオペレーションによりすべてのスクリプトファイルが追跡されることが保証され、依存関係はコンパイル時に記録されて、すべての推移的な依存関係が計算されます。そしてクラスではなく、スクリプトだけが依存関係を記録されます。また、新しいGroovyScriptEngineはスクリプトのコンパイルに一つのプロセスしか使いません。これは、過去にスタックオーバーフローを引き起こしていた循環/相互依存の問題を解決します。結果的に、新しいエンジンは依存関係をより確実に処理でき、またずっと高速なはずです。

GroovyConsoleの設定項目


GroovyConsoleには、コードエリアと出力ビューの間のセパレータの位置や、使っていたフォントサイズを記憶しないという、ちょっと(特に大きな液晶画面を使っている開発者にとっては)不快なところがありました。これは修正され、設定を記憶するようになりました。
もう起動するたびにいちいちコンソールを調整する必要はありません。これからはあなたの好みを覚えてくれるはずです。

GroovyConsoleの新しい出力ウィンドウ


GroovyConsoleでのスクリプトの実行結果用に、新しいビジュアル化オプションができました。結果を出力ペインの末尾に表示するのではなく、外部ウィンドウを使って見れるようになります。CTRL-RやCMD-Rでスクリプトを実行すると、下のスクリーンショットのような感じで表示されるでしょう。このウィンドウは、Escape、CTRL-W(MacならCMD-W)またはEnterキーを叩けば消去できます。


また、編集エリアの欄外には行番号が追加されました。

SQLバッチアップデートとトランザクション

バッチアップデート


GroovyのSqlクラスは、クロージャとステートメントインスタンスをとる新しいwithBatch()メソッドによってバッチアップデート機能を持つようになりました:

トランザクション


同様に、データセットも扱えるwithTransaction()メソッドがSqlに追加されました:

  • No labels