Lombok在构建器中返回自定义构建对象

时间:2018-05-23 05:26:04

标签: java java-8 lombok

我是一个我没有能力修改的课程,但希望有一个建设者。我使用的是龙目岛。

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class SampleClass {
    private String a;
    private String b;
}

为了拥有这个构建器,我创建了一个BuilderClass:

@Builder
public class SampleClassBuilder {
    private String x;
    private String y;

    public SampleClass build() {
        SampleClass sampleClass = new SampleClass();
        sampleClass.setA(x + "testX");
        sampleClass.setB(y + "textY");
        return sampleClass;
    }
}

要使用它,我需要这样做:

SampleClass sampleClass = SampleClassBuilder.builder().x("x -- ").y("y---").build().build();

有没有办法覆盖构建方法以返回SampleClass以避免执行build.build?

2 个答案:

答案 0 :(得分:0)

我不认为Lombok可以这样做:从Builder返回另一个对象。它甚至不能在建造者中称超级。

也许您可以使用Lombok来定义自己的构建:

public class SampleBuilder {
    private String x;
    private String y;

    public static SampleBuilder builder() {
        return new SampleBuilder();
    }

    private SampleBuilder() {
    }

    public SampleBuilder x(String x) {
        this.x = x;
        return this;
    }

    public SampleBuilder y(String y) {
        this.y = y;
        return this;
    }

    public SampleClass build() {
        SampleClass sampleClass = new SampleClass();
        sampleClass.setA(x + "testX");
        sampleClass.setB(y + "textY");
        return sampleClass;
    }
}

在您的客户端代码中,您可以看到Lombok's like使用者:

SampleClass obj = SampleBuilder.builder().x("x").y("y").build();

答案 1 :(得分:0)

如果您只需要自定义构建器的 setter(例如 .x(...) .y(...) 但不是自定义 .build()),您可以添加 SampleClassBuilder 作为静态内部类来覆盖一些Lombok setter 方法。

@Builder // <--- Put @Builder at the SampleClass itself, not at Builder class
@ToString
class SampleClass { // Lombok will internally create SampleClassBuilder

    private String x;
    private String y;
    private int a,b,c;
    private String z;

    public static class SampleClassBuilder{ // Need to name like this to override Lombok class
        public SampleClassBuilder x(String x){
            this.x = x + "testX"; // Lombok will also create `this.x` for this builder class (also y,a,b,c,z)
            return this;
        }
        public SampleClassBuilder y(String y){
            this.y = y + "testY";
            return this;
        }
        public SampleClassBuilder z(String z){
            this.z = this.x + this.y; // *`.z()` must be called lastly if refer to other fields
            return this;
        }
    }

要使用它,您只需执行以下操作:

SampleClass sample = SampleClass.builder().x("One").z(null).y("Two").a(1).b(2).c(3).build();
System.out.println(sample); // SampleClass(x=OnetestX, y=TwotestY, a=1, b=2, c=3, z=OnetestXnull)

*请注意,使用此模式,.z(...) 需要在其他人之后调用;否则,该值将错误为 z="OnetestXnull",因为此时 ynull

要克服这个问题:

  • 您可以将 this.z(null) 附加到方法 x()y()
  • 或者,在此处使用另一种模式:https://stackoverflow.com/a/65773183/2710335 以避免将 this.z(null) 放在任何地方(例如 this.z = this.x + this.y + this.a + this.b + this.c + ...;)。