Lombokの@Builderアノテーションを使う

Lombokの@Builderアノテーションを使用する

1. 概要

Project Lombokの@Builderは、定型コードを記述せずにBuilder patternを使用するための便利なメカニズムです。 このアノテーションは、Classまたはメソッドに適用できます。

この簡単なチュートリアルでは、@Builderのさまざまな使用例を見ていきます。

2. Mavenの依存関係

まず、pom.xmlProject Lombokを追加する必要があります。


    org.projectlombok
    lombok
    1.16.20.0

Maven Centralにはlatest version of Project Lombok here.があります

3. クラスで@Builderを使用する

最初のユースケースでは、単にClassを実装しており、ビルダーを使用してクラスのインスタンスを作成したいと考えています。

最初の唯一のステップは、クラス宣言に注釈を追加することです。

@Getter
@Builder
public class Widget {
    private final String name;
    private final int id;
}

Lombok does all of the work for us.これで、Widgetを作成してテストできます。

Widget testWidget = Widget.builder()
  .name("foo")
  .id(1)
  .build();

assertThat(testWidget.getName())
  .isEqualTo("foo");
assertThat(testWidget.getId())
  .isEqualTo(1);

If we want to create copies or near-copies of objects, we can add the property toBuilder = true to the @Builder annotation

@Builder(toBuilder = true)
public class Widget {
//...
}

これにより、LombokはtoBuilder()メソッドをClassに追加するようになります。 toBuilder()メソッドを呼び出すと、returns a builder initialized with the properties of the instance it is called on:

Widget testWidget = Widget.builder()
  .name("foo")
  .id(1)
  .build();

Widget.WidgetBuilder widgetBuilder = testWidget.toBuilder();

Widget newWidget = widgetBuilder.id(2).build();
assertThat(newWidget.getName())
  .isEqualTo("foo");
assertThat(newWidget.getId())
  .isEqualTo(2);

テストコードを見ると、Lombokによって生成されたビルダークラスの名前がクラスと同じで、“Builder”が追加されていることがわかります。この場合はWidgetBuilderです。 次に、必要なプロパティを変更し、build()を新しいインスタンスに変更できます。

4. メソッドで@Builderを使用する

ビルダーで構築したいオブジェクトを使用しているが、can’t modify the source or extend the*Class*.

まず、Lombok’s @Value annotation:を使用して簡単な例を作成しましょう

@Value
final class ImmutableClient {
    private int id;
    private String name;
}

これで、2つの不変メンバー、それらのゲッター、およびすべての引数のコンストラクターを持つfinalClassができました。

We covered how to use @Builder on a Class, but we can use it on methods, too.この機能を使用して、ImmutableClientを変更または拡張できないことを回避します。

次に、ImmutableClientsを作成するためのメソッドを使用して新しいクラスを作成します。

class ClientBuilder {

    @Builder(builderMethodName = "builder")
    public static ImmutableClient newClient(int id, String name) {
        return new ImmutableClient(id, name);
    }
}

このアノテーションは、returns a Builder for creating ImmutableClientsであるbuilder()という名前のメソッドを作成します。

これで、ImmutableClientを作成できます。

ImmutableClient testImmutableClient = ClientBuilder.builder()
  .name("foo")
  .id(1)
  .build();
assertThat(testImmutableClient.getName())
  .isEqualTo("foo");
assertThat(testImmutableClient.getId())
  .isEqualTo(1);

5. 結論

この記事では、メソッドでLombokの@Builderアノテーションを使用して、finalClass.のビルダーを作成しました

いつものように、コードサンプルはover on GitHubで見つけることができます。