目前我有这三个类:

@Value
@NonFinal
@SuperBuilder
public class Parent {
    // Some fields
}

@Value
@EqualsAndHashCode(callSuper = true)
@SuperBuilder(toBuilder = true)
public class ChildA extends Parent {
    // Some fields
}

@Value
@EqualsAndHashCode(callSuper = true)
@SuperBuilder(toBuilder = true)
public class ChildB extends Parent {
    // Some fields
}

我想在映射器中使用它如下以避免重复任何代码:
private ChildA buildChildA(Entity entity) {
    Parent parent = ((ChildB) buildParent(entity, ChildA.builder().build()))
        .toBuilder()
        // Populate Child A fields from entity
        .build();
}

private ChildB buildChildB(Entity entity) {
    Parent parent = ((ChildA) buildParent(entity, ChildA.builder().build()))
        .toBuilder()
        // Populate Child B fields from entity
        .build();
}

private Parent buildParent(Partner entity, Parent parent) {
    return parent.toBuilder()
        // Populate Parent fields here
        .build();
}

但是,当我尝试编译时,我得到:
ChildA.java:13: error: method does not override or implement a method from a supertype
@SuperBuilder(toBuilder = true)
^
ChildB.java:13: error: method does not override or implement a method from a supertype
@SuperBuilder(toBuilder = true)
^
2 errors

你如何将 toBuilder 与 @SuperBuilder 一起使用?我正在使用 lombok v1.18.4。

最佳答案

如果要将 @SuperBuildertoBuilder 一起使用,则层次结构中的所有类都必须具有 toBuilder=true 。原因是 toBuilder() 方法只从其各自的类中复制字段值,但将字段值从父类(super class)型的复制委托(delegate)给父类(super class)型的 toBuilder() 方法。

所以也只需将 toBuilder=true 添加到您的 Parent 类中。

关于java - 如何在@SuperBuilder 上使用 Lombok 的 toBuilder,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54197544/

10-11 20:53