簡體   English   中英

lombok 調用默認構建器的子類函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM