Groovyに触ってみよう
javacが不要 |
大半のスクリプト言語と同じく、Groovyではプログラム実行前にコードをコンパイルする必要がない。つまりGroovyのスクリプトは、ちょうどブラウザがWebページの閲覧時にJavaScriptを実行するのと同様に、プログラム実行時にインタプリタ実行される仕組みである。もちろん、こうしたインタプリタ実行には処理スピードの低下という代償が伴うため、パフォーマンスが問われる用途には適さない。しかしコンパイルが不要になることで、とりわけビルドと実行のサイクルの短縮という点で見れば、計り知れないメリットが得られる。短期間でのプロトタイピングや各種のユーティリティ開発、テスト・フレームワークなどに最適な環境を提供するのである。
例えばEmailer.groovyinというGroovyスクリプトがあるとしよう。これを実行するには、コマンドラインにて「groovy Emailer.groovyin」とタイプするだけでよい。これに対し、JavaファイルEmailer.javaを実行しようとすれば、まずは「javac Emailer.java」と入力してコンパイルを済ませ、その後で「java Emailer」と入力しなくてはならない。一見するとささいな差であるように思えるが、より規模の大きなアプリケーション開発を想像すればそのメリットの大きさを容易に理解できるはずだ。
また後述するように、Groovyではアプリケーション・コードを単純に実行するだけであれば、mainメソッドを記述する必要もないのである。
|
動的型付けの威力 |
Groovyでは、ほかの主なスクリプト言語と同様に、C++やJavaのような明示的な型付けが不要である。オブジェクトの型が実行時に動的に検出されるため、記述すべきコードの量はぐっと少なくなる。まずはリスト1およびリスト2の例を見ていただきたい。
リスト1は、JavaにおいてString型のローカル変数を宣言する例である。ここで、型名と変数名、そして値のすべてを宣言しなくてはならない点に注意していただきたい。
リスト1 Javaの静的な型付け |
|
一方、リスト2のGroovyの例では、変数の型を宣言する必要がないのが分かる。ちなみにGroovyでは文末のセミコロンを省略可能だ。
リスト2 Groovyの動的な型付け |
myStr = "Hello World" |
Groovyのこうした動的な型付けは、メソッドやその引数の使い方に劇的な変化をもたらしている。多態性(ポリモフィズム)の能力がJavaから大きく様変わりしているのだ。例えば、Groovyでは継承を使わなくても多態性を活用できる。リスト3を見れば、その優れた柔軟性の一端がうかがえるはずだ。
リスト3 Groovyの動的な型付け(多態性の例) |
class Song{ |
ここでは、SongおよびBookという2つのクラスをGroovyで定義している。いずれのクラスもnameというプロパティを備えている。またオブジェクトのnameプロパティの内容を表示するdoSomethingという関数を定義した。
ここで、doSomething関数の引数には特定の型を指定していないことに注目してほしい。同関数はnameプロパティを備えるあらゆるオブジェクトを引数として受け取れるのである。リスト4は、doSomething関数の引数としてSongおよびBookぞれぞれのインスタンスを利用する例である。
リスト4 動的型付けの利用例 |
mySong = new Song(length:90, name:"Burning Down the House") |
またリスト4の最後の2行では、「関数への参照」を簡単に作成できる例が示されている。Groovyでは関数を含むすべてがオブジェクトで表現されるため、このような記述も可能になる。
Groovyにおける動的型付けのもう1つのメリットは、import文の量が減ることである。なお、明示的に型を指定する場合はimport文が必要になるが、それぞれのクラス名に短い「別名」を割り当てることも可能だ。
■動的型付けの実例
以上のようなGroovyの動的型付けを利用した2つの例を紹介しよう。ここでは、Freemakerと呼ばれるオープンソースのテンプレートエンジン(http://freemarker.sourceforge.net/)を呼び出すプログラムをJavaとGroovyの双方で作成した。いずれも、ディレクトリやファイルの名前を基にTemplateオブジェクトを作成し、その内容を標準出力に表示するという簡単なコードである。この同じ作業を実行するために、コード量にどの程度の差があるのか注目してほしい。
リスト5 JavaによるTemplateReaderクラスの例 |
import java.io.File; |
一見すると、リスト5のJavaコードはとてもシンプルだ。とりわけ、スクリプト言語を使ったことのない読者にはそう思えるだろう。ではこのコードがGroovyではどれだけ短くなるのか、リスト6を見ていただきたい。
リスト6 GroovyによるTemplateReaderの例 |
import freemarker.template.Configuration as tconf |
このように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全記事一覧 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (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に関する基礎知識を解説する。
|
|