mmts1007’s diary

プログラミング関連の技術系ブログです。

Lombok でコード量を削減!

前回の記事でも書きましたが、Spring Boot のサンプルではあえて Lombok を使用しませんでした。
理由はまだ Lombok の解説をしていなかったので。

ということで、Lombok の解説をしようと思います。

What's Lombok

公式:Project Lombok

簡単にいうと、Java のお決まりのコードを排除するためのライブラリです。 Getter/Setter とかコンストラクタとかお決まりで書いているコードをアノテーションを付けることで排除できるようになります。(すごい!)

導入

Lombok は依存関係に追加する他に、IDE にも設定する必要があります。

  1. 依存関係の解決 公式にも記載されていますが、 Gradle を使う場合は下記の通り
provided "org.projectlombok:lombok:1.16.6"

ちなみに providedapply plugin: 'war' を指定しないと使えないので、指定していない場合は compile に変更してください。

  1. IDE への追加 Eclipse の場合は公式から jar をダウンロード、ダブルクリックし、Lombok をインストールしたい IDE を選択すれば完了です。

サンプル

サンプルに Spring Boot の時に使用したエンティティをリファクタします。

元ソース

package hello.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "tasks")
public class Task {

    @Id
    @GeneratedValue
    private Integer id;

    @Column(nullable = false)
    private String context;

    public Task() {
    }

    public Task(Integer id, String context) {
        this.id = id;
        this.context = context;
    }

    public Integer getId() {
        return id;
    }

    public String getContext() {
        return context;
    }
}

まずはコンストラクタを削除
今回、引数なしのコンストラクタと、すべてのフィールドを持つコンストラクタが定義されているので、この 2 つを Lombok で生成します。 引数なしのコンストラクタ@NoArgsConstructor、すべてのフィールドを持つコンストラクタ@AllArgsConstructor で生成できます。

package hello.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "tasks")
@NoArgsConstructor
@AllArgsConstructor
public class Task {

    @Id
    @GeneratedValue
    private Integer id;

    @Column(nullable = false)
    private String context;

    public Integer getId() {
        return id;
    }

    public String getContext() {
        return context;
    }
}

同様に Getter/Setter も削除します。
@Getter@Setter アノテーションもあるのですが、データを管理するクラスのためのアノテーション @Data を付与します。
@Data@Getter@Setter アノテーションを含んでいるので、付与されます。

package hello.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Entity
@Table(name = "tasks")
@NoArgsConstructor
@AllArgsConstructor
public class Task {

    @Id
    @GeneratedValue
    private Integer id;

    @Column(nullable = false)
    private String context;
}

コード量がかなり少なくなりました。

f:id:mmts1007:20151012172542p:plain

Outline を見ると、ちゃんとコンストラクタ、Getter/Setter が定義されていますね。

その他のアノテーション

Lombok には他にも様々なアノテーションがあります。

Lombok feature overview

@Data, @Value, @Builder 辺りはすぐに導入できると思います。

@Data

上でも解説しましたが、POJO や Beans に使用するアノテーションです。 また、POJO や Beans に使用するアノテーション @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor も自動で付与されます。

@ToString

デバッグがしやすいように、クラスのフィールド名、フィールドの値を出力するように toString メソッドをオーバーライドします。

@EqualsAndHashCode

オブジェクトに定義されているフィールドの値で equails, hashCode を算出できるように equails, hashCode メソッドをオーバーライドします。
プレーンな Java だと Bean クラスのフィールドの値が一緒でも、equals は false になってしまうので、開発者がいちいち再定義するのは面倒なのでありがたいです。

@Value

イミュータブル(不変の値)を持つクラスを簡単に生成するアノテーションです。
イミュータブルなので値の変更ができないため、フィールドはデフォルトで private, final になります。setter は生成されません。

@Builder

ビルダーパターンを簡単に生成するアノテーションです。

以上です。
Lombok はデファクトスタンダードになると思います。すでにデファクトスタンダードかもしれません。
メリットの方が大きいと思うので、積極的に導入しはいかがでしょうか。