![](/img/trans.png)
[英]Mapstruct generated class uses Lombok builder from parent instead of child
[英]lombok call child class function for default builder
我有 2 个班级,其中父母在构建时需要子班级的一些财产。 有没有办法使用 lombok 构建器来支持这一点?
父程序
import lombok.Builder;
import lombok.Getter;
import lombok.experimental.SuperBuilder;
@Getter
@SuperBuilder
public abstract class Parent {
@Builder.Default
private String requestType = getRequestTypeFromSubclass();
abstract String getRequestTypeFromSubclass();
}
子程序
import lombok.Builder;
import lombok.Getter;
import lombok.experimental.SuperBuilder;
import java.util.List;
@Getter
@SuperBuilder
public class Child extends Parent {
@Override
String getRequestTypeFromSubclass() {
return "Child1";
}
}
以上在编译时失败并带有消息
错误:不能从静态上下文@SuperBuilder 引用非静态方法 getRequestType()
正如Baeldung 中所建议的,使用toBuilder=true
并删除@Builder.Default
import lombok.Getter;
import lombok.experimental.SuperBuilder;
@Getter
@SuperBuilder(toBuilder=true)
public abstract class Parent {
private String requestType = getRequestType();
abstract String getRequestType();
}
有了这个,我们可以摆脱双重初始化
使用toBuilder
和 Child 更改调用构建器:
import lombok.Getter;
import lombok.experimental.SuperBuilder;
@Getter
@SuperBuilder
public class Child extends Parent {
@Override
String getRequestType() {
return "Child1";
}
public static void main(String[] args) {
Child child = Child.builder().build();
System.out.println(child.getRequestType());
}
}
Builder.Default
在静态作用域中定义,表达式可能无法解析抽象方法实现。
可能你想试试这个:
@Getter
@SuperBuilder
public abstract class Parent {
private String reqType;
abstract String getRequestType();
public String getReqType() {
return Objects.isNull(reqType) ? getRequestType() : reqType;
}
}
使用与实际属性 getter 方法不同的方法名称覆盖属性方法,应该可以解决问题。
尝试:
Parent parent = Child.builder().build();
虽然 lombok 是许多事情的好工具,但在这种情况下,您可能希望避免使用构建器模式。 您想要的效果(在标准 POJO 构造函数中可以在父初始化时访问子方法。以下对我有用:
@Getter
public abstract class Parent {
private String requestType = defineRequestType();
protected abstract String defineRequestType();
}
@Getter
public class Child extends Parent {
protected String defineRequestType() {
return "child1";
}
}
以及以下测试用例:
@Test
public void test_lombokBuilderPolymorphism() {
Child child1 = new Child();
assertEquals("child1", child1.getRequestType());
}
因此,除非您出于某些其他原因确实需要构建器模式,否则默认 POJO 的功能在这里似乎就足够了。
附带说明:您应该将定义方法命名为get...
以外的其他方法get...
这样它就不会与生成的 getter ( getRequestType
) 发生冲突。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.