繁体   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