以下は、Groovyクラシックのコードベースと、新しいGroovy JSR構文との互換性を確保するための変更点のチェックリストです。
安全なナビゲーション
クラシックGroovyでは次の構文を使いました
NullPointerExceptionを避けるための安全なナビゲーションにアロー(矢印)演算子を使っていたことにかわり、これからは?.演算子を使います
JSRでは次の構文を使います
クロージャ構文でのパラメータセパレータ
クラシックGroovyではクロージャ内のセパレータとして単一のトークンを使うことができ、次の構文を使っていました
今後JSRでは次の構文を使います
クロージャ内のクロージャパラメータとコードの間のセパレータとして単一のトークンを使うことができ、任意の複合パラメータリスト式やデフォルト値を扱うことができます。例:
Propertyキーワード
- propertyキーワードはアノテーションに置き換えられました
(訳注) 1.0では元に戻っているようです(クラシックと同じ)
'def'キーワードの導入
- これからはローカル変数やフィールドの宣言では'def'、修飾子、そして型(あれば)を指定する必要があります。例:
(構文的には、新しい'def'キーワードはメソッドに対して'public'のような修飾子と同じように振る舞います。)
(明示的に宣言されたクラスとは対照的に)スクリプトに関しては構文に変化はありません。つまり、'def'なしの変数宣言が依然許されています。なぜならこういった変数は、もしまだ存在していないなら自動的にスクリプトにバインドされて生成されるからです。
'as'キーワードの導入
- 'as'キーワードを使ってオブジェクトの型を変換することができます。例:
クラスメンバのデフォルトアクセスレベル
Groovyのクラスメンバのデフォルトアクセスレベルは"public"から"protected"に変更されました。
クラシックGroovy
JSR Groovyでは
配列の生成
- 配列の特別な構文はありません。言語をよりきれいにするため、JSRではリストと配列は単一の構文で扱います。さらに、これからはどんなコレクションや配列でも簡単に任意の配列型に変換することが可能になります。
- 注意 ネイティブの多次元配列生成は現時点ではサポートされていません。
floatとdoubleの記法
- floatとdoubleのリテラルは小数点で始めることはできません。つまり
これは、範囲(1..2)などとのあいまいさを避けるためです。
明示的なメソッドポインタ構文
クラシックGroovyでは、指定されたメソッド名のjava beanプロパティが存在しなければ、自動的にメソッドポインタにアクセスすることができました。
例:
これはしばしば混乱を引き起こしました。すなわち、プロパティアクセスを使って何かを見つけようとして(ミスタイプ等で)誤ってメソッドを取得してしまい、混乱してしまうのです。そこで、これからは以下のように明示的にメソッドポインタを取得するようにしました:
今のところ'do ... while()'構文はなし
あいまいさの問題のため、Groovyではdo .. whileはまだサポートされていません。
「無意味な(dumb)式は禁止」ルール
- 「無意味な式は禁止」ルールにより、改行で崩れてしまったスクリプトでおかしな式を検出することができます。例:
マークアップとビルダ
- マークアップ/ビルダも若干変更されますが、クラシック構文も以前使えます。新しい構文はまだ確定していませんが、マークアップブロックを示すある種の開始/終了構文が導入されるでしょう。おそらくはキーワードとして、例えば:
StringとGString
- シングルおよびダブルクォート文字列は一行に収まらなければなりません。複数行に及ぶ場合はトリプルクォートを使います
- ヒアドキュメントの廃止 - どうせ見苦しいですから
。もし使いたい場合はかわりにトリプルクォートを使いましょう
- GStringの中で$をエスケープする場合は\$を使わなければなりません
- エスケープしやすく、特に正規表現の表記に適した新しい文字列定義もサポートされています:
(訳注) JSRでから導入された//で囲むタイプの文字列リテラルの中では、バックスラッシュ()をエスケープする必要がありません
アサーション
- 二つのパラメータを持つ形式のアサーション文では、区切り文字にはコロンではなくカンマを使います
クロージャ内のreturn/break/continueの動作
未実装
- return/break/continueは、クロージャ内でも(for/whileループのブロックのような)他のブロック内と同じように振る舞います。詳細はこちら
整数除算
以前のGroovyクラシックでは、整数除算演算子としてバックスラッシュを使っていました。このエスケープシーケンスと混同しやすい演算子は廃止されました。代わりにintdiv()メソッドを使って下さい。
次のようになります
JDK5のforループは未サポート
Groovyはすでにかなりの種類のループメカニズムをサポートしています。そしてクラシックではfor (... : ...)とfor (... in ...)の両方がサポートされていました。差し当たり、for (... in ...)記法だけが利用できるようになります。
末端を含まない範囲
上端を含まない範囲を生成する演算子は変更されました。
次の記法にかわり:
今後はこのように書きます: