Groovy
Groovyではコードブロックをファーストクラス(第一級)オブジェクトとして生成し、変数に格納したりメソッド引数や戻り値として受け渡したりすることができる。Groovyのライブラリは繰り返し処理や入出力処理などを中心にクロージャが駆使されており、簡潔な表記を行うことができる。
クロージャは構築されたスコープ内の変数を読み書きできる。
このコードを実行すると
と出力される。
変数の型を指定した物は、メソッドの補完が可能。
リファクタリング。メソッドの抽出、名前の変更など。
デバッガ
ソースコードの整形。
http://groovy.codehaus.org/Eclipse+Plugin にて配布している。
GroovyからJava SEの標準APIをすべて呼び出すことができるが、この際にGroovyから使うと便利なメソッドがリフレクションを用いてJava SEクラスに擬似的に多数追加されている。例えば、クロージャをとるFile#eachLine()といったメソッドを使用することができ、以下の様な記述が可能となっている。
File#eachLine(Closure)はそれぞれの行の値を変数itに代入してクロージャを呼び出す、という繰り返し処理を行うだけでなく、処理の終了時もしくは例外の発生時に、ファイルのクローズ処理を行う。つまりJavaの場合必要なfinally節におけるclose処理を必要とせず簡潔に記述できる。他に同様に、Reader#eachLine(Closure)メソッドなども追加されている。また、File#getText(String characterCodeSetName)、Reader#getText()、Reader#readLines()というファイルの全ての内容を一括で読み込むメソッドが追加されており、入出力処理を簡潔に記述することができる。
Groovyの言語仕様はJavaのそれをベースとしており、基本的にJavaプログラマにとって慣れ親しみやすいものである。Groovyはスクリプト言語として大幅に簡易化された記述を許している。以下に簡略な記述を可能とするGroovy言語の特徴を示す。
変数の型宣言は不要である。 通常の場合 - 宣言をしなかった場合Object型として扱われ、メソッド呼び出しは動的ディスパッチによって解決される(変数の型の宣言をすることも可能であり、静的なスタイルと動的なスタイルの場合に応じた使い分けることができる)。メソッドの引数や返り値の型宣言も同様である。 @TypeChecked を使用した場合 - 変数の型を指定しなかった場合は型推論され、型が正しいかどうかチェックされる。メソッド呼び出しは動的ディスパッチのまま。 @CompileStatic を使用した場合 - 上記に加えて、メソッド呼び出しは静的に解決される。@ToString のようなコンパイル時のメソッド生成は通常通り使える。この3種の中では最速。
メソッド呼び出しの括弧は省略できる。
行末のセミコロンは省略できる。
リストやマップの初期化を記述する組み込み構文を持つ。
演算子のオーバーロード定義(ユーザ定義演算子)が可能である。 組み込み型としてリストやマップを扱うことができ、それらのリテラル表記や、それらを処理する演算子が定義されている。 BigDecimal、BigInteger型などについては四則演算がオーバーロード定義されている。