我是一个我没有能力修改的课程,但希望有一个建设者。我使用的是龙目岛。
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?
答案 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",因为此时 y
为 null
。
要克服这个问题:
this.z(null)
附加到方法 x()
和 y()
this.z(null)
放在任何地方(例如 this.z = this.x + this.y + this.a + this.b + this.c + ...;
)。