在抽象 class 上使用带有 toBuilder 的 Lombok @SuperBuilder 注释?

Using Lombok @SuperBuilder annotation with toBuilder on an abstract class?

我有以下 classes:

@SuperBuilder(toBuilder = true)
public abstract class Parent {
    //...
}

@SuperBuilder(toBuilder = true)
public class Child extends Parent {
    //...
}

@SuperBuilder(toBuilder = true)
public class Child2 extends Parent {
    //...
}

为什么我无法在抽象 class (Parent) 的实例上调用 toBuilder(),如以下代码所示?

public copy(Parent parent) {
    parent.toBuilder().build();
}

可能是因为Lombok不能保证Parent的每个child class也被标记为@SuperBuilder(toBuilder=true),如果是这样,Lombok不能调用[=该实例的 12=];

其实和一样,Lombok无法知道是否有子class没有toBuilder=true.

Lombok 可以要求抽象 class 的所有直接子 class 也通过在抽象 class 上添加 abstract toBuilder() 方法来使用 toBuilder .但是,可能存在子 classes 不应该有 toBuilder 的用例(尽管我还没有看到任何好的例子)。此外,间接子 classes 可能仍然缺少 toBuilder 特性。因此,lombok 不会对抽象 classes.

的子classes 强制执行 toBuilder

好消息是,您可以通过手动将 abstract toBuilder() 方法添加到 abstract class Parent 来轻松解决您的情况(仅直接子 classes):

@SuperBuilder(toBuilder = true)
public abstract class Parent {
    public abstract ParentBuilder<?, ?> toBuilder();
}

进行此更改后,您的 copy 方法将按预期进行编译和工作。

如果你也有间接子classes,你必须找到其他方法来确保它们也有@SuperBuilder(toBuilder = true)。如果那些没有此注释,您可能会遇到奇怪的行为(例如调用 copy() 将实例化一个不同的 class)。

免责声明: 我实现了 @SuperBuilder 功能。