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を書いた例です。
EclipseのIDEのコード補完とか駆使すれば、ある程度、楽に書けるのですが、
冗長なコードになってしまうのと、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を使います。
@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もまだあるので、いろいろ楽になるかもしれない。