Lombok でコード量を削減!
前回の記事でも書きましたが、Spring Boot のサンプルではあえて Lombok を使用しませんでした。
理由はまだ Lombok の解説をしていなかったので。
ということで、Lombok の解説をしようと思います。
What's Lombok
簡単にいうと、Java のお決まりのコードを排除するためのライブラリです。 Getter/Setter とかコンストラクタとかお決まりで書いているコードをアノテーションを付けることで排除できるようになります。(すごい!)
導入
Lombok は依存関係に追加する他に、IDE にも設定する必要があります。
- 依存関係の解決 公式にも記載されていますが、 Gradle を使う場合は下記の通り
provided "org.projectlombok:lombok:1.16.6"
ちなみに provided
は apply plugin: 'war'
を指定しないと使えないので、指定していない場合は compile
に変更してください。
サンプル
サンプルに 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; }
コード量がかなり少なくなりました。
Outline を見ると、ちゃんとコンストラクタ、Getter/Setter が定義されていますね。
その他のアノテーション
Lombok には他にも様々なアノテーションがあります。
@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 はデファクトスタンダードになると思います。すでにデファクトスタンダードかもしれません。
メリットの方が大きいと思うので、積極的に導入しはいかがでしょうか。