劇的にコード量を減らせるLombok

「Lombok」はアノテーションによるコード自動生成を行うライブラリ・ツール。圧倒的にコードの見た目がスッキリするので生産性も劇的に上がる。1度使うと手放せなくなる。

特徴

「Lombok」はアノテーションによるコード自動生成を行うライブラリ・ツール。

Javaではgetterやコンストラクタなどわかりきっているけど何度も何度も書かなければいけないコードがある(俗にボイラープレートコードという)。Eclipseではこれらを自動生成するコマンドがある。それはそれでよいのだが「Lombok」は更に上をいく。それはソースコード上にコードを記述しなくても、アノテーション指定するだけでいいというところ。

例えばフィールド多い場合、getterを自動生成できたとしてもgetterのコードでクラスの半分以上が埋まってしまうことがある。「Lombok」では、ぽつんとアノテーションが加わるだけでクラスの半分以上が埋まるなんてことはない。

ここが革命的に素晴らしいところ。圧倒的にコードの見た目がスッキリするので生産性も劇的に上がる。1度使うと手放せなくなる。

特徴一覧
  • 「ロンボク」と読む。

  • アノテーションによるコードの自動生成を行う。

  • 基本的にはIDEとの連携をしながら利用するので、簡単なインストール作業は必要。

  • コードの自動生成はコンパイル時に行われるのでjarとしてアプリケーションに組み込む必要が無い。よってMavenではscopeをprovidedで指定するのが普通。

  • 本体とは少し離れた感じでexperimentalに分類されるモノがある。利用しても構わないが、本体よりはしっかりサポートされない(様子)。適度に使う。

アノテーションによる自動生成の例

「Lombok」はアノテーションを指定するだけで自動生成する。

Lombokの利用例(@Getterを利用)
@Getter
public class Person {
  private String name;
}

生成されるコードのイメージは次のようになる。

コンパイル後に生成されるコード
public class Person {
  private String name;

  public String getName() {
    return name;
  }
}

慣れていないと本当に自動生成されるのか不安になるが、例えばEclipseのクイックリアウトラインなんかで確認すると、生成されているのがしっかり確認できる。

Lombokによる@Getter自動生成の確認

Lombokによる@Getter自動生成の確認

どのアノテーションがどんなコードを生成してくれるかは公式サイトにコード付きで説明されているので、そこから見つける。

アノテーション一覧

Table 1. 主にクラスに指定するアノテーション
アノテーション 概要

@NoArgsConstructor

引数なしのコンストラクタの生成。

@RequiredArgsConstructor

finalフィールドを引数にとるコンストラクタの生成。
初期化定義されているフィールドは含まない。

@AllArgsConstructor

全フィールドを引数にとるコンストラクタ
初期化定義されているフィールドは含まない。

@Builder

クラス生成を行うビルダークラスの生成。
ビルダーパターン。

@Getter / @Setter

getter,setter。

@Data

@Getterと@Setterと@ToStringと@EqualsAndHashCodeと@RequiredArgsConstructor。
WebフレームワークのフォームやBeanなどで使うと便利。

@Value

@Dataのイミュータブル版。

@EqualsAndHashCode

equals()とhashcode()の生成。
excludeで除外するフィールドを指定できる。

@ToString

toString()の生成。
excludeで除外するフィールドを指定できる。

@Slf4j(@Log)

loggerフィールドの生成。
SLF4jの他にもいくつかのロガーに対応している。

Table 2. 主にメソッドに指定するアノテーション
アノテーション 概要

@NonNull

引数のnullチェック自動生成。
デフォルトではNullPointerExceptionが投げられることになる。

@Synchronized

メソッド全体をsynchronizedブロックで囲うコードの自動生成。ロックに利用するフィールドも自動生成する。synchronizedキーワードとの違いは、全体(this)をロック対象とするか否か。

@SneakyThrows

チェック例外を囲い再スローするコードの自動生成。
一時的にコンパイルエラーを回避できる。

Table 3. ローカル変数に指定するアノテーション
アノテーション 概要

val

変数の型宣言をfinalで自動生成。
長い型名も「val」になるので相当スッキリする。
finalであることも安全性を高めるのでうれしい。

@Cleanup

指定した変数のclose()処理を自動生成する。
try-with-resourceよりもコードがシンプル。

Appendix A: 参考

Appendix B: 改訂履歴

  • v1.0,2016-08-10: 初稿