返回

协调兼容性:#Builder所面临的难题

后端

@Builder所碰见的问题

一、问题

对于下面这两个类,一个父类,一个子类。两个类都想使用@Builder注解,用于使用构造器模式去构造一个对象。

@Builder
public class Parent {
    private String name;
    private int age;
}

@Builder
public class Child extends Parent {
    private String school;
}

当我们尝试编译上面的代码时,会报错,报错的内容如下。

error: cannot inherit from final Builder

无法将类<包路径>.Parent与父类<包路径>.Child一起构建,因为<包路径>.Parent的内部类Builder是final类。

二、原因

这个问题的根源在于@Builder注解的实现方式。@Builder注解实际上是一个注解处理器,它会在编译时生成一个名为Builder的内部类。这个内部类提供了一个build()方法,用于创建所需的对象。

当我们同时在父类和子类上使用@Builder注解时,就会生成两个名为Builder的内部类。然而,Java不允许一个类同时存在两个具有相同名称的内部类。因此,编译器会报错。

三、解决方案

有几种方法可以解决这个问题。一种方法是将@Builder注解只应用于父类。这样,子类就可以继承父类的Builder内部类。

@Builder
public class Parent {
    private String name;
    private int age;
}

public class Child extends Parent {
    private String school;
}

另一种方法是将@Builder注解应用于子类,并使用@继承注解来继承父类的Builder内部类。

@Builder
public class Parent {
    private String name;
    private int age;
}

@Builder(builderMethodName = "childBuilder")
@InheritBuilder
public class Child extends Parent {
    private String school;
}

使用这种方法,您可以在子类中使用childBuilder()方法来构建一个子类对象。

四、总结

在使用@Builder注解时,需要注意避免在父类和子类上同时使用该注解。如果您需要在子类中使用@Builder注解,可以使用@继承注解来继承父类的Builder内部类。