在抽象类上使用 Lombok @SuperBuilder 注释和 toBuilder ?

Hos*_*asr 7 java lombok

我有以下课程:

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

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

@SuperBuilder(toBuilder = true)
public class Child2 extends Parent {
    //...
}
Run Code Online (Sandbox Code Playgroud)

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

public copy(Parent parent) {
    parent.toBuilder().build();
}
Run Code Online (Sandbox Code Playgroud)

Jan*_*eke 10

事实上,正如Hossein Nasr 已经解释的那样,Lombok 无法知道是否存在没有的子类toBuilder=true

Lombok 可能需要toBuilder通过在抽象类上添加abstract toBuilder()方法来使用抽象类的所有直接子类。然而,可能存在子类不应该有 a 的用例toBuilder(尽管我还没有看到任何好的例子)。此外,间接子类可能仍然缺乏该toBuilder功能。因此,lombok 不强制toBuilder抽象类的子类。

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

@SuperBuilder(toBuilder = true)
public abstract class Parent {
    public abstract ParentBuilder<?, ?> toBuilder();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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