LombokでJavaの冗長なコードを排除する

Javaで開発しているとリクエストやレスポンスをマッピングするクラス(Value Object)とか
レイヤを跨ぐ場合に使うクラス(Data Transfer Object)など多用することがあるので、
アクセサー(getter/setter)を書くのが大変で、辛い。
Lombokを使うとかなり楽になると思うので、それについて、書きます。

環境に関して

今回の環境は、下記の環境で、検証しました。

Lombokのインストール

利用する為には、Eclipseにインストールする必要があります。
http://projectlombok.org/からlombok.jarをダウンロードしてきます。
ダウンロードしたJARファイルを起動します。

java -jar lombok.jar 

GUIが立ち上がってくると思います。
通常は、IDEsに利用しているEclipseのパスが表示されていると思うので、
そのままInstall/Updateで、インストールは完了します。

Apache Mavenの設定

POMファイルの依存関係を定義する部分にlombokを追加します。

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>${lombok.version}</version>
	<scope>provided</scope>
</dependency>

普通にValue Objectを書いた場合

まず、普通にValue Objectを書いた例です。
EclipseIDEのコード補完とか駆使すれば、ある程度、楽に書けるのですが、
冗長なコードになってしまうのと、Value ObjectとかDTOをいっぱい作るようなある程度の規模のアプリの場合、
大変だったりします(辛い)。

public class Message implements java.io.Serializable {
	private Integer id;
	private String message;
	public Message() {
		super();
	}
	public Message(Integer id, String message) {
		super();
		this.id = id;
		this.message = message;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((message == null) ? 0 : message.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Message other = (Message) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (message == null) {
			if (other.message != null)
				return false;
		} else if (!message.equals(other.message))
			return false;
		return true;
	}
	@Override
	public String toString() {
		return "Message [id=" + id + ", message=" + message + "]";
	}
}

Lombokを利用して書いた場合

Lombokは、その冗長なコードの部分をAOPで書くことができます。
これは、コンパイル時に、そのその冗長なコード部分を付加して、コンパイルされる仕組みになっています。
上のクラスと同じようなクラスを作る場合は、3つのAOPを使います。

@Data

下記の部分をコンパイル時に補完してくれます。

  • アクセサー(getter/setter)
  • hashCode()
  • equals()
  • toString()
@NoArgsConstructor

デフォルトコンストラクタコンパイル時に補完してくれます。

@AllArgsConstructor

メンバーを引数にとるコンストラクタコンパイル時に補完してくれます。|

上の3つのAOPを使って書いたクラスは、下の様なクラス定義になります。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Message  implements java.io.Serializable {
	private Integer id;
	private String message;
}

また、setterを付けたくない場合は、@Dataでなく、個別にAOPを指定する必要があります。
その場合は、@EqualsAndHashCode、@ToStringをクラスに付け、メンバーに対して、@Getterを付与します。

@EqualsAndHashCode
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Message  implements java.io.Serializable {
	@Getter
	private Integer id;
	@Getter
	private String message;
}

Eclipseの補完機能より、かなり楽になるかも(個人的には、メソッドにコメントとか書かなくてもいいからwww)。
それ以外のAOPもまだあるので、いろいろ楽になるかもしれない。