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



javacが不要

 大半のスクリプト言語と同じく、Groovyではプログラム実行前にコードをコンパイルする必要がない。つまりGroovyのスクリプトは、ちょうどブラウザがWebページの閲覧時にJavaScriptを実行するのと同様に、プログラム実行時にインタプリタ実行される仕組みである。もちろん、こうしたインタプリタ実行には処理スピードの低下という代償が伴うため、パフォーマンスが問われる用途には適さない。しかしコンパイルが不要になることで、とりわけビルドと実行のサイクルの短縮という点で見れば、計り知れないメリットが得られる。短期間でのプロトタイピングや各種のユーティリティ開発、テスト・フレームワークなどに最適な環境を提供するのである。

 例えばEmailer.groovyinというGroovyスクリプトがあるとしよう。これを実行するには、コマンドラインにて「groovy Emailer.groovyin」とタイプするだけでよい。これに対し、JavaファイルEmailer.javaを実行しようとすれば、まずは「javac Emailer.java」と入力してコンパイルを済ませ、その後で「java Emailer」と入力しなくてはならない。一見するとささいな差であるように思えるが、より規模の大きなアプリケーション開発を想像すればそのメリットの大きさを容易に理解できるはずだ。

 また後述するように、Groovyではアプリケーション・コードを単純に実行するだけであれば、mainメソッドを記述する必要もないのである。

スクリプティングのパワー
スクリプト言語がポピュラーな理由は、容易に習得でき、開発者にとって敷居が低いことにある。そのシンプルで簡潔な文法を活用することで、一般的なプログラミング言語よりも少ない行数で実用的なアプリケーションを記述できる。PerlやPython、Ruby、そしてGroovyなどのスクリプト言語は、コードを巧みに組み立てる能力を備え、いままでにない効率的なプログラミングを実現する。この身軽さによって、開発生産性の向上が期待できるのである。スクリプト言語の昨今の隆盛を見れば、それが単なるニッチ技術や便利なツールではなく、GoogleやYahoo、IBMなどのグローバル企業も導入する将来性のあるテクノロジであることは明らかだろう。

動的型付けの威力

 Groovyでは、ほかの主なスクリプト言語と同様に、C++やJavaのような明示的な型付けが不要である。オブジェクトの型が実行時に動的に検出されるため、記述すべきコードの量はぐっと少なくなる。まずはリスト1およびリスト2の例を見ていただきたい。

 リスト1は、JavaにおいてString型のローカル変数を宣言する例である。ここで、型名と変数名、そして値のすべてを宣言しなくてはならない点に注意していただきたい。

リスト1 Javaの静的な型付け

String myStr = "Hello World";

 一方、リスト2のGroovyの例では、変数の型を宣言する必要がないのが分かる。ちなみにGroovyでは文末のセミコロンを省略可能だ。

リスト2 Groovyの動的な型付け

myStr = "Hello World"

 Groovyのこうした動的な型付けは、メソッドやその引数の使い方に劇的な変化をもたらしている。多態性(ポリモフィズム)の能力がJavaから大きく様変わりしているのだ。例えば、Groovyでは継承を使わなくても多態性を活用できる。リスト3を見れば、その優れた柔軟性の一端がうかがえるはずだ。

リスト3 Groovyの動的な型付け(多態性の例)

class Song{
  length
  name
}

class Book{
  name
  author
}

def doSomething(thing){
  println "going to do something with a thing named = " + thing.name

 ここでは、SongおよびBookという2つのクラスをGroovyで定義している。いずれのクラスもnameというプロパティを備えている。またオブジェクトのnameプロパティの内容を表示するdoSomethingという関数を定義した。

 ここで、doSomething関数の引数には特定の型を指定していないことに注目してほしい。同関数はnameプロパティを備えるあらゆるオブジェクトを引数として受け取れるのである。リスト4は、doSomething関数の引数としてSongおよびBookぞれぞれのインスタンスを利用する例である。

リスト4 動的型付けの利用例

mySong = new Song(length:90, name:"Burning Down the House")
myBook = new Book(name:"One Duck Stuck", author:"Phyllis Root")

doSomething(mySong) //Burning Down the Houseと表示
doSomething(myBook) //One Duck Stuckと表示

anotherSomething = doSomething

anotherSomething(myBook) //One Duck Stuckと表示

 またリスト4の最後の2行では、「関数への参照」を簡単に作成できる例が示されている。Groovyでは関数を含むすべてがオブジェクトで表現されるため、このような記述も可能になる。

 Groovyにおける動的型付けのもう1つのメリットは、import文の量が減ることである。なお、明示的に型を指定する場合はimport文が必要になるが、それぞれのクラス名に短い「別名」を割り当てることも可能だ。

動的型付けの実例

 以上のようなGroovyの動的型付けを利用した2つの例を紹介しよう。ここでは、Freemakerと呼ばれるオープンソースのテンプレートエンジン(http://freemarker.sourceforge.net/)を呼び出すプログラムをJavaとGroovyの双方で作成した。いずれも、ディレクトリやファイルの名前を基にTemplateオブジェクトを作成し、その内容を標準出力に表示するという簡単なコードである。この同じ作業を実行するために、コード量にどの程度の差があるのか注目してほしい。

リスト5 JavaによるTemplateReaderクラスの例

import java.io.File;
import java.io.IOException;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class TemplateReader {

  public static void main(String[] args) {
    try{
  Configuration cfg = Configuration.getDefaultConfiguration();
  cfg.setDirectoryForTemplateLoading(
       new File("C:\\dev\\projects\\http-tester\\src\\conf"));
    
  Template temp = cfg.getTemplate("vendor-request.tmpl");

     System.out.println(temp.toString());
      }catch(IOException e){
        e.printStackTrace();
      }
  }
}

 一見すると、リスト5のJavaコードはとてもシンプルだ。とりわけ、スクリプト言語を使ったことのない読者にはそう思えるだろう。ではこのコードがGroovyではどれだけ短くなるのか、リスト6を見ていただきたい。

リスト6 GroovyによるTemplateReaderの例

import freemarker.template.Configuration as tconf
import java.io.File

cfg = tconf.getDefaultConfiguration()

cfg.setDirectoryForTemplateLoading(
  new File("C:\\dev\\projects\\http-tester\\src\\conf"))
  
temp = cfg.getTemplate("vendor-request.tmpl")

println temp.toString()

 このようにGroovyのコードは、Javaコードの半分の長さに収まる。その理由は以下のとおりだ。

  • Groovyではimport文が半減する。またfreemarker.template.Configurationクラスにtconfという別名を付けることで、簡潔な記述が可能になる
  • GroovyではTemplate型の変数tempの型宣言を記述する必要がない
  • Groovyではクラス宣言やmainメソッドが不要である
  • Groovyでは例外処理を気にする必要がなく、またIOExceptionのimport文も省略できる

 ここで、あなたが最近作成したJavaクラスについて思い出してほしい。たくさんのimport文や型宣言、そしてそれと同数のセミコロンを書いたはずだ。では、同じコードをGroovyで実装するとどうなるだろう。より手短に思いのままに記述でき、守るべきルールも少ないうえ、まったく同じ結果を得られるのである。

2/4

 INDEX

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

Java Solution全記事一覧





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

注目のテーマ

Java Agile 記事ランキング

本日 月間