![](/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.