デフォルトでインポートされているクラス

  • java.lang.*
  • java.io.*
  • java.net.*
  • java.util.*
  • groovy.lang.*
  • groovy.util.*
  • java.math.BigDedimal
  • java.math.BigInteger

スクリプト

  • 見た目上はクラスに所属しないコード
  • クラス定義やmainメソッドの定義を記述することなしに、groovyコマンドで実行できる
  • 内部的に生成されたクラス定義に所属するメソッドにコンパイルされて実行される
スクリプトの実行
  • スクリプトが「hoge.groovy」というファイルとして保存されている場合、「groovy hoge.groovy」で実行可能
  • スクリプトの1行目を「#!」で始めることで、UNIX環境ではGroovyスクリプトを実際にスクリプトとして実行することができる
#!/usr/loacl/bin/groovy
  • Mac OS Xの場合はenvコマンドを経由してgroovyコマンドを指定する(「#!/usr/bin/env groovy」のように指定する)
  • Windowsでは、PATHEXT環境変数を設定することで、groovyスクリプトをコマンドとして実行可能
バインディング変数
  • スクリプトで使用する特別な変数
  • 変数の宣言をしない
  • 型を指定することができず、常にObject型
  • 型を指定しないことを意味するdefを指定することもできない
  • スクリプト中でメソッドを定義したときに、メソッドの中からメソッドの外にあるバインディング変数を参照できる

クラス定義

  • Groovyではpublicクラス定義を含むファイル名は、そのクラス名と一致する必要はない
実行可能なクラス(groovyコマンドでファイル名を指定して実行できるクラス)
  • mainメソッドを定義しているクラス
  • jUnit3、4やTestNGのテストケース、もしくはGroovyTestCaseを継承したクラス
  • Runnableをimplementsしたクラス
アクセス制御
  • クラスやメンバのアクセス修飾のデフォルトはpublic
  • 現在のGroovyではprivateやprotectedのアクセス指定がなされたフィールドやメソッドに対しても、アクセス制限が無視されpublic扱いでアクセスすることができる(公式にはバグとして登録されている)

メソッドとコンストラクタ

名前付き引数
  • 実引数に名前を付け、その名前に基づいて参照することができる機能
  • 引数の順序を気にせずに、順不同で引数を与えることができる
  • Groovyでは、マップで引数をやり取りすることで名前付き引数を実現
  • 具体的には、メソッド定義側では、マップで引数を受け取るようにし、呼び出し側では、引数を「名前:値」をカンマで区切って与えてメソッドを呼び出す
def hoge(Map param) {
     println "${param.author}著 「${param.title}」価格${param.price}円"
}
 
hoge(title:"普通の本", author:"さとうたろう", price:1000)                                                                    
  • コンストラクタについても、名前付き引数の指定の形式でコンストラクタを呼び出すと、引数の名前を持つメンバをその引数の値で初期化してくれる(ただし、引数のないコンストラクタだけが定義されている場合のみ。引数を取るコンストラクタを1つでも明示的に定義すると、名前付き引数によるコンストラクタは自動的には利用できない)
デフォルトの引数
  • Groovyでは、引数を省略した場合のデフォルト値が設定可能
def hoge(def arg="hello world") {
    println arg
}

hoge()
メソッド呼び出し時のカッコの省略
  • Groovyではメソッド呼び出しが式文としてのトップレベルにあり、引数が1個以上の場合、カッコを省略できる(これを「コマンド式」と呼ぶ)
  • 1.8からは、さらに拡張された「拡張コマンド式」が利用可能に
staticメソッド
  • Groovyではstaticメソッド中でもthisを参照できる
  • staticメソッド中のthisはそのstaticメソッドが所属するクラスオブジェクトのインスタンスを示す

文字列型

文字列リテラル
  • Groovyには文字列リテラルの表現の方法が6種類ある
  • Groovyはchar型のリテラルの記法がない。シングルクォートで括った場合でもString型の文字列リテラルになる
  • ダブルクォートとシングルクォートの違いは、GStringの展開がされるかどうか
  • GStringとは「$変数名」あるいは「${式}」を含む文字列リテラルであり、ダブルクォートで括った場合は、これらの形式が変数の値や式に置換される
数値型
  • Groovyでは、接尾辞を指定しない浮動小数リテラルの型はBigDecimalとなる
接尾辞
I/iInteger
L/lLong
F/fFloat
D/dDouble
G/gBinInteger/BigDecimal

ジェネリクス

  • JavaのジェネリクスはGroovyでも使用可能
  • ただし、現状のGroovyではジェネリクスのパラメータ型の情報が、型エラーのチェックに用いられることはない

クロージャ

  • クロージャ:「生成時のコンテキストを含んだコードブロック」「状態を持った関数」
  • クロージャに含まれているコードを実行するには、call()メソッドを呼び出す。call()を省略してメソッド呼び出しと同じ表現でも呼び出すことができる。
  • クロージャには引数を与えることができ、クロージャのブロック先頭に「->」を使って区切って仮引数を指定する。
  • 実引数はcallの引数として与えたり、メソッド呼び出しと同様に与えることができる。
  • 引数リストを書かないと暗黙の引数「it」を1つ取るクロージャであると見なされる。
  • 引数を取らないクロージャを表現するには、クロージャの冒頭の「{」の直後に仮引数リストを書かないで「->」を指定する。
Closure clos = { -> println "引数とらない" }
  • メソッドの最後の引数がクロージャである場合にはメソッド呼び出しの括弧の直後にクロージャを書くことができる。
collectionに格納されている値から奇数のものだけ取得。findAllメソッドはクロージャを引数にとる。
def result = collection.findAll{ it % 2 == 1 }

管理人/副管理人のみ編集できます