Lombok は、特に POJO (Plain old Java Object (POJO) での Java の冗長性を排除するために利用できる Java™ ユーティリティーです。Lombok は冗長性を排除する手段として、アノテーションを使用します。Lombok を開発環境に実装することによって、hashCode()equals() などのメソッドを作成する時間だけでなく、お決まりのアクセサーやミューテーターの組み合わせを作成する時間も大幅に節約することができます。

Brian M. Carey, Senior Systems Engineer, Triangle Information Solutions

Photo of Brian CareyBrian Carey は、Java エンタープライズ・アプリケーションのアーキテクチャー、設計、実装を専門とするインフォメーション・システムのコンサルタントです。



2010年 2月 16日

Lombok とは何か

Lombok とは、Java コードの冗長性を排除するために利用できる JAR (Java Archive) ファイルのことです。

例えば標準的な Java Bean を考えてみてください。通常、Java Bean には複数のプロパティーがあり、これらのプロパティーごとにアクセサーとミューテーター (ゲッターとセッター) があります。さらに一般的には、toString() メソッドと equals() メソッド、そして hashCode() メソッドもあります。

こう考えてみると、予測できる冗長性はすさまじいほどになりそうです。プロパティーごとにゲッターとセッターがあるとわかっているのであれば (通常はそうです)、1 つひとつ手作業で作成しなければならないのでしょうか。

そこで登場するのが Lombok です。Lombok はコード行を減らす目的で、アノテーションを使用して Java コードのクラスやコード・ブロックを識別します。前述の Java Bean の例では、ゲッター、セッター、そして他の 3 つのメソッドのすべてが暗黙的に示されて、コンパイル時に組み込まれます。

それだけではありません。Eclipse または IBM® WebSphere® Studio Application Developer を使用している場合には (使用していないとしたら、使用するべきです)、Lombok を Java プロジェクトに統合して、開発時の結果を瞬時に得ることもできます。つまり、Eclipse コンパイラーが暗黙的なゲッター/セッターを即時に認識して、他の Java コードがこれらのメソッドを参照できるということです。

もちろん、直接的なメリットはコードの行数が減ることです。コードが簡潔になるのは常に望ましいことで、さらに特定のゲッターやセッターに特別の注意を払う必要がある場合でも、たった 1 つの対象を見つけるために何十行ものコードに目をとおす必要がなくなります。そしてコードが簡潔になっていれば、冗長性も少なくなります。このように、すべてにおいて良い結果をもたします。

Lombok で単純化できるのは Java Bean だけではありません。コードの他の部分についても単純化することができます。例えば、try/catch/finally ブロックや同期化されたメソッドでも、冗長なコードを排除することができます。

では早速、実際の開発環境で冗長性を排除する具体的な方法を説明します。


Lombok のインストール方法

この記事で説明するインストール手順では、読者が Eclipse または WebSphere Studio Application Developerを使用していることを前提とします。この 2 つを使用していないとしても Lombok を使用することはできますが、開発時のメリットを活かすことができません。ただし、コンパイル時のメリットは活かすことができます。

まずは、お気に入りのブラウザーを開いて、URL に http://projectlombok.org/ と入力してください。

この記事を執筆している時点では、上記の URL でアクセスしたページの右上隅に、大きな文字で「Download!」と表示されます。この文字をクリックして、lombok.jar のダウンロード手順に進んでください。他のサイトからダウンロードするファイルの 99 パーセントは解凍の必要がありますが、このファイルにはその必要はありません。

ダウンロードが完了したら、この JAR ファイルを実行してください。それには、オペレーティング・システムでプロンプトを開き、lombok.jar がインストールされているディレクトリーに進んで、java -jar lombok.jar と入力します。

ここで前提となるのは、JRE (Java Runtime Environment) がパスに設定されていることです。設定されていない場合は、追加する必要があります。その方法については、使用しているオペレーティング・システムのマニュアルを調べてください。

Microsoft® Windows® を使用している場合には、JAR ファイルを実行する方法として、lombok.jar アイコンをダブルクリックすることもできます。すると、グラフィカル・ユーザー・インターフェース (GUI) から JAR を実行することができます。

いずれの方法にしても、最終的には Lombok インストール画面が表示されます。この画面では、Eclipse または WebSphere Studio Application Developer の実行可能プログラムが置かれている場所を指定します。画面ではおそらく正しい場所にデフォルト設定されているはずですが、デフォルトの場所を変更することもできます。

Install/Update (インストール/更新)」をクリックすると、即座に Lombok が Eclipse 開発環境に組み込まれます。この時点で Eclipse を実行中の場合は、いったん Eclipse をシャットダウンしてから再始動してください。


Lombok の使用方法

ここまでで準備ができたので、実際に Eclipse または WebSphere Studio Application Developer 内で Lombok を使ってみましょう。まずは、リスト 1 のコードを見てください。

リスト 1. 順調な Java Bean の滑り出し
public class Lure {
	private String name;
	private int size;
	private String color;
	private String style;
}

単純な Java Bean は、上記のように始まるのが典型的です。この後、通常はプロパティーのそれぞれにゲッターとセッターを追加し、さらに equals() メソッド、toString() メソッド、hashCode() メソッドを追加していくことになります。

Lombok を使用すれば、これらの追加は一切必要ありません。代わりに @Data というアノテーションを 1 つ追加すればよいだけです。

まさに、それだけの話です。@Data を組み込んだリスト 2 を見てください。

リスト 2. さらに順調な Java Bean の滑り出し
import lombok.Data
public @Data class Lure {
	private String name;
	private int size;
	private String color;
	private String style;
}

注意する点として、lombok.jar がビルド・パスに含まれていて、lombok.Data が Java クラスにインポートされない限り、このコードは機能しません。

Eclipse または WebSphere Studio Application Developer でクラスのアウトラインを見てみると (画面では通常、クラスの右側に表示されます)、これらのメソッドは自動的に Lure クラスに追加されていることがわかります。

アウトラインが表示されていない場合は、Eclipse の「Window (ウィンドウ)」メニューをクリックして、「Show View (ビューの表示)」を選択してください。これによって表示されるメニューから「Outline (アウトライン)」を選択します (画面の右側に表示)。アウトラインを表示させるためのホットキーは、Alt+Shift+Q を押した後、O を押すという組み合わせです。

Lure をインスタンス化する別のクラスを作成しても、Lure が暗黙的に示す getName()setSize() などのメソッドにすぐにアクセスすることができます。また、equals()hashCode()toString() にもアクセスすることもできます。賢い仕組みだと思いませんか?

一方、Eclipse または WebSphere Studio Application Developer を使用していない場合、これらの暗黙メソッドの追加は、コードを実際にコンパイルする時点で認識されます。このように、Lombok は Eclipse や WebSphere Studio Application Developer がなくても使用できるものの、本来は、Eclipse または WebSphere Studio Application Developer に統合するように設計されています。

Lombok はゲッター/セッター・メソッドを生成する際に、従来の標準に従います。したがって、すべてのメソッド名には接頭辞として get または set が付き、プロパティー名は大文字になります。例外は当然、プロパティーが Boolean の場合です。この場合、ゲッターは get ではなく、is で始まります。これは、Java Bean の標準的慣例です。

今度は、Java Bean のゲッターのうちの 1 つに特殊な要件がある場合を考えてみてください。リスト 2 の例で、getStyle() が色とサイズの組み合わせを返すとします。その場合には、好きなように getStyle() メソッドをコードにすればよいだけです。Lombok はそのコードを調べ、プロパティーに基づいて独自の getStyle バージョンを作成することはしません。

一般公開したくないゲッター・メソッドがあるという場合もあります。このような場合のために、Lombok では括弧で囲んだパラメーターを入力できるようになっています。リスト 3 に、カスタム修飾子の例を記載します。

リスト 3. カスタム修飾子
	private String name;
	@Getter(AccessLevel.PROTECTED) private int size;
	private String color;
	private String style;

上記のようにすると、getSize() メソッドは一般公開されません。このメソッドには保護修飾子が設定されているため、派生したサブクラスと Lure クラス自体のなかでだけ使用することができます。

Lombok が指定しているデフォルト値を受け入れたくないという場合もあります。一例として、toString() メソッドは単純にクラス名を表示し、そのクラスのすべてのプロパティー名と値をカンマ区切りリストの形式で表示します。このリストは、クラス名の隣に括弧で囲まれて表示されます。

例えば、Lure クラスをログに記録する際に、色については記録する必要がないとします。この場合、ToString アノテーションを使用することで、toString() のデフォルトを変更することができます。

リスト 4. toString() の変更
@ToString(exclude="color")
public @Data class Lure {
	private String name;
	private int size;
	private String color;
	private String style;
}

インスタンス化した Lure クラスの例を出力すると、以下のように表示されます。

Lure(name=Wishy-Washy, size=1, style=trolling)

色が除外されている理由は、アノテーションによって Lombok に色を除外するように指示したからです。

equals() メソッドと hashCode() メソッドの処理方法を変更することもできます。その方法は、リスト 5 を見ての通りです。

リスト 5. hashCode() の変更
@EqualsAndHashCode(exclude="style")
public @Data class Lure {
	private String name;
	private int size;
	private String color;
	private String style;
}

上記の変更により、equals() および hashCode() メソッドが生成されるときには、style プロパティーが除外されることになります。


その他の機能

皆さんは年がら年中 try/catch/finally を作成するのに飽き飽きしていませんか?私は嫌気がさしています。幸い、Lombok を使うことでその必要がなくなります。これも、Lombok によって Java の冗長性が排除される例の 1 つです。try/catch/finally ブロックの冗長性を排除するには、@Cleanup アノテーションを使用すればよいだけです。リスト 6 を見てください。

リスト 6. @Cleanup アノテーションの使用
public static void main(String[] args) throws IOException {
	@Cleanup InputStream in = new FileInputStream(args[0]);
	@Cleanup OutputStream out = new FileOutputStream(args[1]);
	//write file code goes here
}

ご覧のように、いつもの Java コードと比べて大幅に簡潔になっています。ただし注意する点として、呼び出されたコードによってキャッチされる例外は、それが何であってもスローしなければならないことに変わりありません (上記の場合は、IOException)。

リスト 6 のコード・ブロックで重要な点は、try/catch/finally ブロックが排除されているだけでなく、開いているストリームを終了していることです。close() 以外のメソッドを使ってリソースを解放するオブジェクトを操作している場合には、例えば @Cleanup("relinquish") のように、呼び出すメソッドをアノテーションの隣の括弧に含めます。

Lombok には、比較的簡潔にメソッドを同期させる手段もあります。この場合の手段も当然、@Synchronized アノテーションをメソッドに付けるようにします。

リスト 7. @Synchronized アノテーションの使用
@Synchronized
private int foo() {
	//some magic done here
	return 1;
}

上記の例では、Lombok が自動的に $lock という名前のインスタンス・オブジェクトを作成し、このメソッドに対して foo() メソッドを同期させます。

@Synchronized アノテーションが付けられたメソッドが静的メソッドの場合、Lombok は自動的に $LOCK というクラス・オブジェクトを作成し、このクラス・オブジェクトに静的メソッドを同期させます。

さらに、括弧で囲んだパラメーターを使用して、ロックするオブジェクトを明示的に指定することもできます。例えば @Synchronized("myObject") とすると、myObject として知られるオブジェクトに対してメソッドが同期されます。この場合、オブジェクトを明示的に定義する必要があります。


まとめ

Lombok を使用することで、すべてのアプリケーション開発者が必死になって行おうとしている内容を実現することができます。その内容とは、冗長性の排除です。

また、Lombok によってコードを読みやすくすることもできます。コードが読みやすくなれば、多数のプロパティーを持つ Java Bean のなかで、「特殊」な (つまり、通常の標準に従っていない) ゲッターおよびセッター・メソッドを簡単に見つられるようになります。なぜなら、Lombok を使ったコードでは、その特殊なゲッターおよびセッター・メソッドだけが実際にコード化されるからです。

簡潔なコード、生産性の向上、冗長さの解消を促進する Lombok を是非、お使いの環境で試してみてください。

参考文献

学ぶために

製品や技術を入手するために

  • IBM ソフトウェアの試用版を使用して、次のオープンソース開発プロジェクトを革新してください。ダウンロード、あるいは DVD で入手できます。
  • IBM 製品の評価版をダウンロードするか、あるいは IBM SOA Sandbox のオンライン試用版で、DB2®、Lotus®、Rational®、Tivoli®、および WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source, Java technology
ArticleID=475644
ArticleTitle=Java の冗長性を排除する手軽な方法
publish-date=02162010