web-dev-qa-db-ja.com

メソッドでLombok @Builderアノテーションを使用する方法

テストデータを構築する簡単な方法が必要であり、Builderパターンが here のように適切であることがわかりました。ただし、コンポーネントテストの定型コードをさらに減らすために、Project Lombokの @ Builder を試すのが良い候補であることがわかりました。ただし、メソッドでの使用方法に関するドキュメントやオンライン例は見つかりません。実装に変更を加えることができないため、何らかのファクトリメソッドで@Builderを使用したいと思います。

誰かがメソッドで@Builderを実際に使用する方法の例を与えることができますか?

16
user3139545
import static org.junit.Assert.*;
import lombok.Builder;
import lombok.Value;

import org.junit.Test;

@SuppressWarnings("javadoc")
public class ImmutableAnimals {

    @Builder(builderMethodName = "dogBuilder")
    public static Dog newDog(String color, String barkSound) {
        return new Dog(color, barkSound);
    }

    @Builder(builderMethodName = "catBuilder")
    public static Cat newCat(String color, String meowSound) {
        return new Cat(color, meowSound);
    }

    public static interface Animal {
        String getColor();
    }

    @Value
    public static class Cat implements Animal {
        String color;
        String meowSound;
    }

    @Value
    public static class Dog implements Animal {
        String color;
        String barkSound;
    }

    @Test
    public void testDog() {
        final String expectedBarkSound = "woof";
        final String expectedColor = "brown";

        final Dog dog = Animals.dogBuilder()
            .barkSound(expectedBarkSound)
            .color(expectedColor)
            .build();

        assertEquals(expectedBarkSound, dog.getBarkSound());
        assertEquals(expectedColor, dog.getColor());
    }

    @Test
    public void testCat() {
        final String expectedMeowSound = "purr";
        final String expectedColor = "white";

        final Cat cat = Animals.catBuilder()
            .meowSound(expectedMeowSound)
            .color(expectedColor)
            .build();

        assertEquals(expectedMeowSound, cat.getMeowSound());
        assertEquals(expectedColor, cat.getColor());
    }
}
import static org.junit.Assert.*;
import lombok.Builder;
import lombok.Data;

import org.junit.Test;

@SuppressWarnings("javadoc")
public class MutableAnimals {

    @Builder(builderMethodName = "dogBuilder")
    public static Dog newDog(String color, String barkSound) {
        final Dog dog = new Dog();
        dog.setBarkSound(barkSound);
        dog.setColor(color);
        return dog;
    }

    @Builder(builderMethodName = "catBuilder")
    public static Cat newCat(String color, String meowSound) {
        final Cat cat = new Cat();
        cat.setMeowSound(meowSound);
        cat.setColor(color);
        return cat;
    }

    public static interface Animal {
        String getColor();
    }

    @Data
    public static class Cat implements Animal {
        String color;
        String meowSound;
    }

    @Data
    public static class Dog implements Animal {
        String color;
        String barkSound;
    }

    @Test
    public void testDog() {
        final String expectedBarkSound = "woof";
        final String expectedColor = "brown";

        final Dog dog = MutableAnimals.dogBuilder()
            .barkSound(expectedBarkSound)
            .color(expectedColor)
            .build();

        assertEquals(expectedBarkSound, dog.getBarkSound());
        assertEquals(expectedColor, dog.getColor());
    }

    @Test
    public void testCat() {
        final String expectedMeowSound = "purr";
        final String expectedColor = "white";

        final Cat cat = MutableAnimals.catBuilder()
            .meowSound(expectedMeowSound)
            .color(expectedColor)
            .build();

        assertEquals(expectedMeowSound, cat.getMeowSound());
        assertEquals(expectedColor, cat.getColor());
    }
}
21
Jeff

これが @ Builder の使用方法です。

//Employee.Java
import lombok.Builder;
import lombok.ToString;

@Builder
@ToString
public class Employee {
   private final String empName;
   private final int salary;
}

//   Main.Java

public class Main {

public static void main(String[] args) {
    Employee emp = Employee.builder().empName("Deendaya").salary(100).build();
    System.out.println(emp);
  }
}
32
Deendayal Garg

上記の回答で回答が完了したと思いますが、ここでいくつかのポイントを指摘したいと思います。ビルダーを使用する場合、ドキュメントに記載されているこれらの7つのものを生成します。

•ビルダ​​ー内:ターゲットの各パラメーターごとに1つのプライベート非静的非最終フィールド。 •ビルダ​​ー内:パッケージプライベート引数なしの空のコンストラクター。 •ビルダ​​ー内:ターゲットの各パラメーターの「セッター」のようなメソッド:そのパラメーターと同じ名前と同じタイプを持っています。上記の例のように、セッター呼び出しを連鎖できるように、ビルダー自体を返します。 •ビルダ​​ー内:各フィールドに渡してメソッドを呼び出すbuild()メソッド。ターゲットが返すのと同じ型を返します。 •ビルダ​​ー内:賢明なtoString()実装。 •ターゲットを含むクラス内:builder()メソッド。ビルダーの新しいインスタンスを作成します。 •FooBuilderという名前の内部静的クラス。静的メソッド(ビルダーと呼ばれる)と同じ型引数を持ちます。

Lombokは、ユニットテストケースを記述する必要があり、モデル/ pojoも無視しないように組織から指示された場合に問題を作成します。

0
Vipul