uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

GroovyにおけるProject Coin相当拡張について

id:fumokmmさんの日記で、「5分で理解するProject Coin」というすばらしい記事があり、Java 7の言語に関連する拡張がすぐに良くわかるように紹介されています。(私もしばらく前に記事をかきました。)

Groovyでもじつは、Coinの文法拡張について細かいものも含めてちまちまと対応されていて、最新版ではけっこう使えるんです*1

まずはダイアモンド(型推論)

List<List<List<String>>> list = new ArrayList<>()

問題なし。でも、なぜかあんまりメリットを感じられない:)。

Groovy 1.8beta3からです。

二進数リテラル

1.9-beta-1からです。

$ groovy -e 'println 0b110010101010'
3242
$ groovy -e 'println 0b110010101010.class'
class java.lang.Integer
$ groovy -e 'println 0b000101001111111111111111111000000010.class '
class java.lang.Long

数値リテラル中のアンダースコアが無視される

これも1.9-beta-1から。

$ groovy -e 'println 0b110_010_101010'
3242
$ groovy -e 'println 0xffff_5555'
4294923605
$ groovy -e "println 3_3"
33

このように二進リテラルにかぎりません。

例外のマルチキャッチ

try {
  if (args.size() == 0) throw new IllegalArgumentException();
  else throw new NullPointerException();
}
catch (IllegalArgumentException | NullPointerException e) {
  println e
}

1.9-beta-1から。

その他

switch文にプリミティブ以外が使えるとか、コレクションのリテラルや、リストとマップに対する添字アクセスとかはGroovyでは最初期からできた話。

リースパターンの劣化版*2たるtry-with-resourceは、Groovyに導入してもどうかな、とは思うけど、まあ互換のためだけに入ることになるのかな。

*1:ただし、1.9-betaについては現時点ではSVNから取ってきてビルドする必要があります。

*2:というと語弊あるかもしれませんが、ライブラリを大きくは変更しないという前提での妥協の産物としては高レベルなものだとは思いますが、リースパターンと比較するとクローズ処理の柔軟性や可読性においてダメダメなものだと思います。反論歓迎。