Lombokとは

"Lombok"は、Javaの冗長なコードを削減するライブラリの名前です。

Javaに対するライブラリで、冗長なコード(例えばgetter、setter、equals、hashCodeなどのメソッド)を注釈(アノテーション)を用いて自動生成する機能を提供します。これにより、より簡潔で読みやすいコードを書くことができます。

例えばLombokを使わない定型コードが冗長な例として以下のPerson1.javaを見てください。

package lombokTest;

public class Person1 {
	private String name;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null || getClass() != obj.getClass()) {
			return false;
		}

		Person1 person = (Person1) obj;

		if (age != person.getAge()) {
			return false;
		}
		return name != null ? name.equals(person.getName()) : person.getName() == null;
	}

	@Override
	public int hashCode() {
		int result = name != null ? name.hashCode() : 0;
		result = 31 * result + age;
		return result;
	}

	public static void main(String[] args) {
		Person1 p1 = new Person1();
		p1.setName("matsuda");
		p1.setAge(33);
		System.out.println(p1.getName());

		Person1 p2 = new Person1();
		p2.setName("matsuda");
		p2.setAge(32);
		System.out.println(p2.getName());

		System.out.println(p2.equals(p1));
	}
}

<実行例>

matsuda
matsuda
false

Lombokを使うことで上記コードが以下のPerson2.javaのようにシンプルなコードに変わります。ポイントは@Dataというアノテーションがついたことです。

package lombokTest;

import lombok.Data;

@Data
public class Person2 {
	private String name;
	private int age;

	public static void main(String[] args) {
		Person2 p = new Person2();
		p.setName("matsuda");
		p.setAge(33);
		System.out.println(p.getName());

		Person2 p2 = new Person2();
		p2.setName("matsuda");
		System.out.println(p2.getName());

		System.out.println(p2.equals(p));
	}
}

<実行例>は同じ

ここで便利なのはフィールドの増減やフィールド名の変更があった場合です。

例えば、以下のような身長フィールドを追加したとします。Person1.javaの場合ですとgetter、setter、equals、hashCodeの4つのメソッドを修正する必要がありますが、Person2.javaの場合はその必要はありません。

以下の記述を加えるだけでセッターやゲッターが使えるようになりますので試してみてください。

private double hight;

また、フィールド名を変更した場合も同様です。以下のようにフィールド名を変更してもPerson2.javaの変更箇所はこの1箇所だけです。

private String customerName;

ただし、メソッドを呼び出す側では例えば以下のような変更が必要になります。

p.setCustomerName("matsuda");

EclipseでのLombokプラグインのインストールと設定

  • Lombokの公式サイト(https://projectlombok.org/download)からにLombokのjarファイルをダウンロードします。
  • ダウンロードしたlombok.jarをWEB-INFフォルダのlibフォルダにコピーします。
lombok.jarの配置

Lombokの主要な機能

Getter/Setterの自動生成

ゲッターとセッターは、クラスの内部状態をカプセル化し、データへの直接的なアクセスを制限するために使用されるメソッドです。これはオブジェクト指向の基本的な原則であり、クラスのフィールド値の読み取り(ゲッター)や設定(セッター)を行うことができます。

しかしこの手法は、同じパターンのコードを何度も書かなければならないという問題を抱えています。この冗長性を解消するために、Eclipseではゲッターやセッターの自動生成機能があります。ただし、コードは肥大化し見にくくなります。

そこでLombokは、ゲッターやセッター、そしてその他の様々なメソッドを自動生成するためのアノテーションを提供しています。これにより、冗長なコード(ボイラープレートコードともいいます)を大幅に削減することができます。

Lombokの使用により、以下Person3.javaのようなシンプルなクラス定義が可能となります。nameとageフィールドに対するゲッターとセッターを自動的に生成します。これにより、コードの可読性が向上し、エラーの発生を防ぐことができます。

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Person3 {
    private String name;
    private int age;
}

toString, equals, hashCodeメソッドの自動生成

Javaでは、オブジェクトの状態を文字列として表現するためのtoStringメソッド、オブジェクトの等価性を判断するequalsメソッド、ハッシュマップのキーとしてオブジェクトを使用するためのhashCodeメソッドなど、オブジェクトに関する重要なメソッドがあります。

これらのメソッドは全て java.lang.Object クラスから継承され、それぞれのクラスでオーバーライドすることが推奨されます。しかし、これらのメソッドを手動で書くことは冗長で、エラーが生じやすいです。そのため、Lombokを使ってこれらのメソッドを自動生成することができます。

具体的には、@ToString、@EqualsAndHashCodeなどのアノテーションをクラス宣言に付けることで、対応するメソッドを自動生成します。

import lombok.EqualsAndHashCode;
import lombok.ToString;

@ToString
@EqualsAndHashCode
public class Person4 {
    private String name;
    private int age;
}

@Dataアノテーション

この記事の最初でご紹介したのが@Dataです。@Dataをクラスに適用すると、これまで説明してきた以下のメソッドが自動的に生成されます。

Getter
Setter
equals
hashCode
toString

import lombok.Data;

@Data
public class Person5 {
    private String name;
    private int age;
}

上記のように@DataアノテーションをPersonクラスに適用すると、nameageフィールドのためのgetterとsetter、equalshashCode、そしてtoStringメソッドが自動的に生成されます。

注意点

しかし、@Dataアノテーションを使う際には注意が必要です。@Dataアノテーションは一種のショートカットであり、上記の各メソッドを一括で生成します。そのため、特定のメソッドだけカスタマイズしたい場合には適用しづらいです。また、クラスの全フィールドに対するgetterやsetterを一度に生成しますので、特定のフィールドに対するアクセスを制限したい場合(例えば、代入できる値の範囲を自然数に限るなど)にも注意が必要です。

コンストラクタの自動生成

Javaでは、クラスには必ず少なくとも1つのコンストラクタが必要です。コンストラクタは、新しいオブジェクトのインスタンスを生成する際に実行される特別なメソッドで、オブジェクトの初期化を行います。

しかし、大規模なクラスや多数のフィールドを持つクラスでは、手動でコンストラクタを書くことは労が多くエラーが発生しやすい作業になります。そこで役立つのが、Lombokによるコンストラクタの自動生成です。

@AllArgsConstructor、@NoArgsConstructorといったアノテーションを提供しており、これらをクラス宣言の上部に付けることで、それぞれ全フィールドを引数に持つコンストラクタ、引数なしのコンストラクタを自動的に生成します。

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
public class Person6 {
    private final String name;
    private int age;
}

以上、Lombokをご紹介しました。

最後までお読みいただきありがとうございます。