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 { |
一方リスト23は、Groovyを利用してJavaBeansを作成した例である。この例のとおり、JavaBeansのプロパティを定義しさえすれば、それらにアクセスするためのアクセッサメソッドはGroovyが自動的に用意してくれる。またJavaBeansにアクセスする方法も簡素化されている。例えばJavaBeansのプロパティを操作するときには、従来のJavaの冗長な書き方だけでなく、Groovyに備わる省略形も利用できる。
リスト23 GroovyによるJavaBeansコンポーネント |
class LavaLamp{ |
■軽快な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 |
ファイルとは要するに複数の行や文字の並びであるため、イテレータで順次処理するのが手っ取り早い。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, |
お気付きのとおり、このコードにおいて変数strにStringをセットする部分では、各行の終わりにダブルクオーテーションや「+」を書いていない。Groovyでは複数の文字列の連結をJavaより簡単に表記できるのである。なお、上記コードを実行すると、「water」にマッチしたことを示す「found a match」というメッセージが表示され、続いて原文の「every where」を「nowhere」で置換した文字列が表示される。
|
まとめ |
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全記事一覧 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
|
|