1. 序章

Project Lombok は、開発者が作成する必要のあるボイラープレートコードの量を減らすのに役立つ人気のあるJavaライブラリです。

このチュートリアルでは、Lombokの @Builder アノテーションがどのように機能し、特定のニーズに合わせてカスタマイズする方法を見ていきます。

2. Mavenの依存関係

依存関係pom.xmlに追加することから始めましょう。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
</dependency>

3. ロンボクビルダーアノテーション

Lombokで生成されたビルダークラスのカスタマイズを検討する前に、Lombok @Builderアノテーションがどのように機能するかを簡単に要約してみましょう。 ロンボクの機能の完全な紹介はすでにあります。

@Builderアノテーションを使用して、クラスのビルダーを自動的に生成できます。 この例では、あるユーザーが別のユーザーにメッセージを送信できるメッセージングシステムを使用します。 メッセージは、単純なテキスト文字列またはファイルのいずれかです。 Lombokを使用すると、Messageクラスを次のように定義できます。

@Builder
@Data
public class Message {
    private String sender;
    private String recipient;
    private String text;
    private File file;
}

@Data は、通常は単純なPOJO(Plain Old Java Object)に関連付けられているすべてのボイラープレートを生成します。すべてのフィールドのゲッター、すべての非最終フィールドのセッター、および適切な toString equalsおよびhashCode実装、およびコンストラクター。

生成されたビルダーを使用して、Messageクラスのインスタンスを生成できるようになりました。

Message message = Message.builder()
  .sender("[email protected]")
  .recipient("[email protected]")
  .text("How are you today?")
  .build();

@Builder アノテーションも属性のデフォルト値をサポートしていますが、ここでは説明しません。 この例から、 @Builder アノテーションは非常に強力であり、多くの定型コードを置き換えることができることは明らかです。

4. Lombokビルダーのカスタマイズ

前のセクションでは、Lombokを使用してビルダークラスを生成する方法を示しました。 ただし、生成されたビルダーでは不十分な場合があります。 この例では、メッセージに含めることができるのはテキストまたはファイルのいずれかのみであるという制約があります。 両方を持つことはできません。 もちろん、ロンボクはそれを知りません。生成されたビルダーは、私たちがその違法な状態に入るのを喜んで許可します。

幸い、ビルダーをカスタマイズすることでこの問題に対処できます。

Lombok Builderのカスタマイズは単純で簡単です。カスタマイズしたいビルダーの部分を記述し、Lombok@Builderアノテーションはそれらの部分を生成しません。 したがって、この例では、次のようになります。

public static class MessageBuilder {
    private String text;
    private File file;

    public MessageBuilder text(String text) {
        this.text = text;
        verifyTextOrFile();
        return this;
    }

    public MessageBuilder file(File file) {
        this.file = file;
        verifyTextOrFile();
        return this;
    }

    private void verifyTextOrFile() {
        if (text != null && file != null) {
            throw new IllegalStateException("Cannot send 'text' and 'file'.");
        }
    }
}

senderおよびrecipientメンバー、またはそれらに関連付けられたビルダーメソッドを宣言する必要がないことに注意してください。 ロンボクはまだ私たちのためにそれらを生成します。

テキストと次のコードのファイルの両方を含むMessageインスタンスを生成しようとすると:

Message message = Message.builder()
  .sender("[email protected]")
  .recipient("[email protected]")
  .text("How are you today?")
  .file(new File("/path/to/file"))
  .build();

その結果、次の例外が発生します。

Exception in thread "main" java.lang.IllegalStateException: Cannot send 'text' and 'file'.

5. 結論

この簡単な記事では、Lombokビルダーをカスタマイズする方法について説明しました。

いつものように、コードはGitHubから入手できます。