Javaの Lombok は改めてすごい!

過去にも Java の Lombok について少しお話ししましたがすごい機能ですよね!

もう一回詳しく調べました。

概要

LombokはJavaのコードをより簡潔にするためのライブラリです。
ゲッター/セッター、コンストラクタ、イミュータブルなオブジェクトなどを自動生成するアノテーションプロセッサが含まれています。

具体的には、LombokはJavaのコードに注釈を追加することでIDEやビルドツールが自動的にコードを生成できるようにします。
これにより、コードを簡潔にすることができます。
例えば、@Getterアノテーションを使用するとクラスのすべてのフィールドに対してゲッターメソッドを自動的に生成することができます。
開発者は自分で煩雑なボイラープレートコードを書く必要がなくなりより簡潔なコードを記述することができます。

Lombokの仕組みは、Javaのコンパイル時にアノテーションプロセッサを使用することで実現されます。
つまり、LombokはJavaコードを解析して自動生成するコードを生成します。
これらの自動生成されたコードは、Javaのコンパイルプロセス中に実際のコードに結合されます。

Lombokは2009年7月にリリースされました。
当初は、Javaのコードをより簡単に記述できるようにするプロジェクトとして開発が始まりました。

 

ボイラープレートコード

ずっとボイラーテンプレートコードだと思ってました😅

ボイラープレートコードとはあるプロセスを実行するために必要な最小限のコードのことを指します。

例えば、Java Beanを作成する場合フィールドやゲッター/セッターのコードを書く必要があります。
このようなコードは構造的には同じであり非常に煩雑なため開発者はこれらのコードを何度も書く必要があります。

 

いろんなライブラリで使っているアノテーションプロセッサ

アノテーションプロセッサはJavaのコンパイル時にコンパイルプロセスの一部として注釈を処理するためのツールです。
アノテーションプロセッサを使用するとコンパイル時に自動的にコードを生成できます。

アノテーションプロセッサは主に3つの方法で使用されます。

  1. コード生成:アノテーションを使用してコードを自動生成することができます。
    Lombokのように、アノテーションを使用して、ゲッターメソッドやセッターメソッドを自動生成することができます。
  2. コンパイル時チェック:アノテーションを使用してコンパイル時にソースコードの正当性をチェックすることができます。
    例えば、JUnitのアノテーションを使用して、ユニットテストを実行することができます。
  3. リフレクションのサポート:アノテーションを使用してリフレクションAPIを使用するための情報を提供することができます。
    例えばSpring Frameworkのようなアプリケーションフレームワークではアノテーションを使用して依存関係を注入するための情報を提供します。

アノテーションプロセッサは、Javaコンパイラに統合されているため、Javaの開発者がアノテーションを使用してカスタム処理を行うことができます。これは、コードの自動生成やコンパイル時チェック、リフレクションのサポートなど多くの機能を提供することができます。

導入時期

アノテーションプロセッサはJava SE 5.0(2004年)で導入されました。
このバージョンでは、アノテーションを使用してメタデータをJavaコードに追加することができるようになりました。
これにより、Javaの開発者はより簡単に自分たちのフレームワークやライブラリを作成することができるようになりました。

アノテーションプロセッサはJavaコンパイラに統合されているためJavaのコンパイル時に自動的に実行されます。
これによりアノテーションを使用してソースコードを自動生成することができます。
アノテーションプロセッサはJavaコンパイラに統合されたため開発者が独自のアノテーションプロセッサを作成しJavaコンパイラで処理することができるようになりました。

2種類のアノテーション

Javaには、コンパイル時に使用されるアノテーション実行時に使用されるアノテーションの2種類のアノテーションがあります。

コンパイル時に使用されるアノテーションは、ソースコードをコンパイルする際にアノテーションプロセッサによって処理されその結果として生成されたコードに影響を与えます。
今回主題とするLombokやJUnitのアノテーションは「コンパイル時に使用されるアノテーション」に分類されるようです。

一方、実行時に使用されるアノテーションは、Javaの実行時にアノテーションを処理するために使用されます。
例えば、Spring Frameworkのアノテーションは、実行時に依存関係を注入するために使用されます。
また、Java EEのアノテーションは実行時にセキュリティ制約やトランザクション制御を実行するために使用されます。

ややこしいですがJavaにはコンパイル時に使用されるアノテーションと実行時に使用されるアノテーションの2種類がありそれぞれ異なるタイミングで処理されます。

Lombokの取り扱い説明書

  • ビルド時にLombokが必要
    LombokはJavaのコンパイル時にアノテーションプロセッサを使用してコードを変換します。
    そのためLombokの機能を使用する場合ビルド時にLombokを含める必要があります。
    これはビルドシステムの設定を変更する必要があるため、Lombokの使用が制限される可能性があります。
  • Javaのコンパイラが制限されることがある
    LombokはJavaのコンパイラを拡張するためLombokが正しく機能するには特定のバージョンのJavaコンパイラが必要になることがあります。
    そのため、Lombokを使用する場合は使用しているJavaのバージョンに合わせたLombokのバージョンを使用する必要があります。
  • 自動生成されたコードに問題があることもある
    Lombokのアノテーションを使用するとコードが自動生成されるため、生成されたコードが予期しない問題を引き起こすことがあります。
    例えば@Dataアノテーションを使用するとequals()やhashCode()などのメソッドが自動生成されます。
    これらのメソッドはクラスの設計に依存する場合があります。
    自動生成されたコードを確認し必要に応じて手動で変更する必要があります。
  • Javaの標準APIに依存しない
    LombokのアノテーションはJavaの標準APIに依存しないためLombokを使用する場合コードがJavaの標準APIと互換性がなくなる可能性があります。
    このためLombokの使用にはプロジェクトの要件や制約を十分に考慮する必要があります。

Lombokの今

Lombokは最新のバージョンは2021年12月時点でv1.18.22です。

LombokチームはLombokの安定性やセキュリティに関する問題を修正するために定期的に更新をリリースしています。
また、新しい機能の追加や改善も行われています。

LombokはJava開発者の間で非常に人気があり多くのプロジェクトで使用されています。
Lombokの機能はJavaの開発プロセスを簡素化するために設計されており多くの開発者がボイラープレートコードを減らしより簡潔なコードを記述するために利用しています。

Lombokの最新バージョンはMaven CentralやGradleのリポジトリから入手できます。
LombokのGitHubリポジトリでは最新のリリースノートやドキュメントなどさまざまなリソースを提供しています。

人気がありつつも最新リリースから1年以上経過しているようです。
すでに完成された感があるのですがJavaそのもののバージョンアップについていけるのかちょっと心配です。