Lombok Builderとカスタムセッター

カスタムセッター付きLombokビルダー

1. 前書き

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

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

2. メーベン依存

pom.xmlthe dependencyを追加することから始めましょう。


    org.projectlombok
    lombok
    1.18.2

3. LombokBuilderアノテーション

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

The @Builder annotation can be used to automatically generate a builder for our class。 この例では、あるユーザーが別のユーザーにメッセージを送信できるメッセージングシステムを使用します。 メッセージは、単純なテキスト文字列またはFileのいずれかです。 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)に関連付けられているすべてのボイラープレートを生成します。すべてのフィールドのゲッター、すべての非最終フィールドのセッター、および適切なtoStringequalsおよびhashCode実装、およびコンストラクター。

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

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

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

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

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

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

Lombokビルダーのカスタマイズは単純明快です:we write the parts of the builder that we want to customize and the Lombok @Builder annotation will simply not generate those parts。 したがって、この例では次のようになります。

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メンバー、またはそれらに関連付けられたビルダーメソッドを宣言する必要がないことに注意してください。 Lombokは引き続きこれらを生成します。

次のコードを使用して、テキストとファイルの両方を含む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ビルダーをカスタマイズする方法について説明しました。

いつものように、コードはover on GitHubで利用できます。