alt.lang.jreコラム:
Groovyに触ってみよう



Groovyのその他の特徴

 ここまではGroovyの基本について取り上げてきたが、このほかにも注目すべきポイントが数多くある。Groovy版のJavaBeansコンポーネントをはじめ、ファイルI/O、正規表現、そしてgroovycによるコンパイル作業などのより高度な機能について以下に説明し、締めくくりとしたい。

Groovy流JavaBeans

 どのようなアプリケーションであれ、実世界の対象を表現するための構造体のようなデータ構造は不可欠だろう。Javaプラットフォームでは、JavaBeansコンポーネントと呼ばれるオブジェクトがこの役割を担っている。JavaBeansは、受注情報や顧客情報、各種リソースなどのビジネスオブジェクトを表現するために広く利用されている。Groovyでは、このJavaBeansによるコーディングを簡素化するための便利な文法を提供しており、プロパティを定義するだけでアクセッサメソッドを自動生成することができる。リスト22リスト23を見れば一目瞭然だが、これによりJavaBeansのコード量はぐっと少なくなる。

 リスト22は、Javaを用いて簡単なJavaBeansを定義した例である。

リスト22 JavaによるJavaBeansコンポーネント

public class LavaLamp {
  private Long model;
  private String baseColor;
  private String liquidColor;
  private String lavaColor;

  public String getBaseColor() {
    return baseColor;
  }

  public void setBaseColor(String baseColor) {
    this.baseColor = baseColor;
  }

  public String getLavaColor() {
    return lavaColor;
  }

  public void setLavaColor(String lavaColor) {
    this.lavaColor = lavaColor;
  }

  public String getLiquidColor() {
    return liquidColor;
  }

  public void setLiquidColor(String liquidColor) {
    this.liquidColor = liquidColor;
  }

  public Long getModel() {
    return model;
  }

  public void setModel(Long model) {
    this.model = model;
  }
}

 一方リスト23は、Groovyを利用してJavaBeansを作成した例である。この例のとおり、JavaBeansのプロパティを定義しさえすれば、それらにアクセスするためのアクセッサメソッドはGroovyが自動的に用意してくれる。またJavaBeansにアクセスする方法も簡素化されている。例えばJavaBeansのプロパティを操作するときには、従来のJavaの冗長な書き方だけでなく、Groovyに備わる省略形も利用できる。

リスト23 GroovyによるJavaBeansコンポーネント

class LavaLamp{
  model
  baseColor
  liquidColor
  lavaColor
}

llamp = new LavaLamp(model:1341, baseColor:"Black", 
  liquidColor:"Clear", lavaColor:"Green")

println llamp.baseColor
println "Lava Lamp model ${llamp.model}"

myLamp = new LavaLamp()
myLamp.baseColor = "Silver"
myLamp.setLavaColor("Red")

println "My Lamp has a ${myLamp.baseColor} base"
println "My Lava is " + myLamp.getLavaColor()

軽快なI/O

 GroovyのI/O処理は実に軽快で、特にイテレータとクロージャを組み合わせたときの効果は大きい。Groovyでは、FileやReader、WriterといったJavaの標準的なI/Oオブジェクトをベースに、クロージャを受け付けるメソッドがそれらに追加されている。リスト24の例を見れば、おなじみのjava.io.FileがeachLineという便利なメソッドを新たに備えていることが分かるだろう。

リスト24 GroovyのI/O処理

import java.io.File

new File("File-IO-Example.txt").eachLine{ line |
 println "read the following line -> " + line
}

 ファイルとは要するに複数の行や文字の並びであるため、イテレータで順次処理するのが手っ取り早い。eachLineメソッドを使えば、引数で渡されたクロージャを用いてファイル(この場合はFile IO Example.txt)の各行を順次処理できる。クロージャはこうした局面でその真価を発揮する。またGroovyでは、どのような例外が発生した場合でも、すべてのファイルリソースは必ずクローズされる。そのためファイルI/O処理においてtry/catch/finally節を随所に記述する手間も掛からないのである。

事前コンパイルも可能

 Groovyのスクリプトは、実行時にJavaクラスのバイトコードに変換される。groovycと呼ばれるコンパイラを利用すれば、この変換を実行前に済ませておくことができる。groovycはコマンドラインもしくはAntから呼び出すことができ、生成されたクラスファイルは通常のjavaコマンドで実行可能だ。ただしその際には、ObjectWebのバイトコード操作フレームワークを収めたgroovy.jarおよびasm.jarをクラスパスに含めておく必要がある。Groovyスクリプトのコンパイルについて詳しくは、GroovyのWebページを参照してほしい。

正規表現を徹底活用

 プログラミング言語の価値は正規表現の使い勝手で決まるといっても過言ではない。Groovyでは、Javaプラットフォームのjava.util.regexライブラリをベースに、いくつかの根本的な変更を加えた正規表現サポートを提供する。例えばPatternオブジェクトを作成する「~」演算子や、Matcherオブジェクトを作成する「=~」演算子が利用できる(リスト25)。

リスト25 Groovyの正規表現

str =  "Water, water, every where,
        And all the boards did shrink;
        Water, water, every where,
        Nor any drop to drink."

if (str =~ 'water'){
  println 'found a match'
}

ptrn = ~"every where"

nStr = (str =~ 'every where').replaceAll('nowhere')

println nStr

 お気付きのとおり、このコードにおいて変数strにStringをセットする部分では、各行の終わりにダブルクオーテーションや「+」を書いていない。Groovyでは複数の文字列の連結をJavaより簡単に表記できるのである。なお、上記コードを実行すると、「water」にマッチしたことを示す「found a match」というメッセージが表示され、続いて原文の「every where」を「nowhere」で置換した文字列が表示される。

対話型シェルですぐに使えるGroovy
Groovyの実行環境としては、標準のインタプリタ(groovy)の他に対話型シェル(groovysh)も用意されている。この対話型シェルはGroovyの習得に重宝する便利なツールだ。

まとめ

 Groovyはいまだ成長過程にあるプロジェクトだ。RubyやPython、Jythonなどに親しんできた開発者ならば、ミキシン(mixin)やメソッドの名前付き引数、そしてスクリプトのインポートなどを早くサポートしてほしいと思うだろう(Javaクラスのコンパイル時にスクリプトをインポートすることは可能)。しかしGroovyはいま急速に変化を遂げつつある。さらに普及が進めば、それらの機能もいずれサポートされるはずだ。

 Groovyは絶妙なポジションに位置する言語である。Javaの基本的な文法は維持しつつ、RubyやPython、Smalltalkのとりわけ有用な機能だけを取り込んでいる。Javaに慣れた開発者にとっては、よりシンプルですぐに使いこなせる。またJavaに不慣れな開発者にとっても、複雑な文法やルールがない分、入門編として最適である。

 もちろん本コラムで紹介したほかの言語と同じく、GroovyはJavaを置き換えるものではない。しかしほかの言語とは異なり、Javaプラットフォームの一部として標準化が進んでいるため、いずれは既存のJava言語と対等に扱われる可能性さえあるのだ。

 今回のalt.lang.jreでは、Groovyが提供する基本の枠組みや文法を紹介し、いくつかの先進的なプログラミング機能を説明した。次回はJava開発者に最も愛用されているスクリプト言語の1つ、JRubyを取り上げる予定だ(第3回以降の邦訳は、IBM developerWorksに掲載される予定です。なお、第1回「Jythonを知る」の邦訳についても、IBM developerWorksに掲載されています)。

4/4  

 INDEX

Groovyに触ってみよう
  Page1
なぜまた新しい言語が必要か
  Page2
javacが不要
動的型付けの威力
  Page3
文法は自由自在
Page4
Groovyのその他の特徴


本記事は「IBM developerWorks」に最初に掲載された「alt.lang.jre:Feeling Groovy」をアットマーク・アイティが翻訳したものです。

Java Solution全記事一覧





Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間