GroovyはJava開発者にとってできるだけ自然であるように作られています。Groovyの設計にあたって、私たちは(特にJavaの経験を持ってGroovyを学ぶ開発者にとって)驚きを最小にするという原則に従ってきました。
ここではJavaとGroovyの主な違いを一覧してみましょう。
デフォルトのimport
以下のすべてのパッケージとクラスはデフォルトでimportされます(これらを利用するために明示的に import 文を使う必要はないということです):
- java.io.*
- java.lang.*
- java.math.BigDecimal
- java.math.BigInteger
- java.net.*
- java.util.*
- groovy.lang.*
- groovy.util.*
よくある落とし穴
ここではGroovyを使い始めたJava開発者にとって、つまづき易いポイントを一覧してみます。
- すべての型において==はequalsを意味します。Javaには、==が基本型については同値性を意味し、オブジェクトにとっては同一性を意味する、という構文上奇妙な部分があります。Groovyではautoboxingを導入しているため、このことはJava開発者の大混乱を招く恐れがあります (なにせxが5のとき、x == 5はほとんどfalseになるでしょうから
。そこで、単純化のためにGroovyでは==はequals()を意味することになっています。もし本当に同一性が必要なときは、foo.is(bar) というように "is" メソッドを使うことができます。これはnullには使えませんが、その場合には==を使って foo==null とすることができます。 - inはキーワードです。だから変数名として使わないように。
- 配列の宣言時に、次のようには書けません
こう書かなくてはなりません
- 次のようなforループの書き方に慣れていたのなら
groovyではこう書く必要がありますまたは
知っておくべきこと
- セミコロンはオプション。使用は任意(一行に複数の文を置くためには必要ですが)。
returnキーワードはオプション。
thisキーワードはstaticメソッドの中でも使えます(そのクラス自身を指す)。
- メソッドとクラスはデフォルトでpublicです。
- Groovyでの
protectedはJavaにおけるpackage-protectedとprotectedの両方に相当します。すなわち、同じパッケージ内にフレンドを持つこともできるし、派生クラスからprotectedメンバを参照することもできます。
- 現在のところ、インナークラスはサポートされていません。大部分のケースでは、かわりにクロージャを使えるでしょう。
- チェック例外と非チェック例外の区別がないため、Groovyのコンパイラではメソッドシグネーチャの
throw節はチェックされません。
- 未定義のメンバを使ったり、間違った型の引数を渡したりしてもJavaのようにコンパイルエラーが起こることはありません。Runtime vs Compile time, Static vs Dynamicを参照してください。
珍しい落とし穴
Javaプログラマは文の区切りにセミコロンを使うことに慣れており、クロージャは存在していません。また、クラス定義の中にはインスタンスイニシャライザがあります。したがって次のようなコードがあるかもしれません:
多くのGroovyプログラマは、気が散るとか冗長だということでセミコロンを省略する傾向があります(常に使う人たちもいますが。コーディングスタイルの問題です)。問題が起こるのは、上の例をGroovyで書くような場合です:
これは MissingMethodException を発生させてしまいます!
この場合問題になるのは、改行は文の区切りではないので、後続のブロックが Thing コンストラクタに引数として渡されるクロージャとして扱われてしまう、ということです。奇妙に思えるでしょうが事実なのです。このようなやり方でインスタンスイニシャライザを使いたいのなら、セミコロンを使うことが事実上必須になります:
このようにして、初期化定義部分に続くブロックを明確にインスタンスイニシャライザとすることができます。
Groovyに追加された、Javaにはない新機能
- クロージャ
- リストやマップのためのネイティブ 構文
- GroovyMarkup およびGPathのサポート
- 正規表現 のネイティブサポート
- ポリモルフィックな イテレーション(繰り返し)と強力な switch文
- 動的および静的型付けのサポート。メソッド、フィールド、変数の型宣言は省略可能
- 文字列 の中に式を埋め込むことが可能
- JDK に追加された、多くの新しいヘルパーメソッド
- beans のプロパティやイベントリスナの追加を書くためのよりシンプルな構文
- ?.演算子を使った 安全なナビゲーション 例: "variable?.field" や "variable?.method()" 。nullチェックのためにネストしたif文でコードがいっぱいになることはもうありません。