解决lombok 父类和子类builder不兼容的问题

yizhihongxing

当使用Lombok框架时,有时会遇到使用父类的Builder创建子类实例时出现兼容性问题的情况。这是因为父类和子类在使用Lombok注解生成的Builder时,使用的是不同的构造器和setter方法。

要解决这个问题,我们可以使用下面的步骤来解决:

1. 使用 @SuperBuilder 注解

在父类和子类中都添加 @SuperBuilder 注解,这个注解会同时生成父类和子类的Builder。例如:

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

@SuperBuilder
@Data
public class Child extends Parent {
    private int grade;
}

这样,在子类中就可以使用父类的Builder来创建子类的实例了。例如:

Child child = Child.builder()
        .name("John")
        .age(10)
        .grade(5)
        .build();

2. 在子类中手动覆盖 Builder 方法

在子类中手动覆盖 Builder 方法,并使用父类的Builder方法来创建父类的实例。例如:

@Data
public class Parent {
    private String name;
    private int age;

    public static abstract class ParentBuilder<C extends Parent, B extends ParentBuilder<C, B>> {
        private String name;
        private int age;

        public B name(String name) {
            this.name = name;
            return self();
        }

        public B age(int age) {
            this.age = age;
            return self();
        }

        protected abstract B self();

        public abstract C build();

        public B from(Parent parent) {
            return this.name(parent.getName())
                    .age(parent.getAge());
        }
    }

    protected Parent(ParentBuilder<?, ?> builder) {
        this.name = builder.name;
        this.age = builder.age;
    }

    public static ParentBuilder<?, ?> builder() {
        return new ParentBuilderImpl();
    }

    private static class ParentBuilderImpl extends ParentBuilder<Parent, ParentBuilderImpl> {
        @Override
        protected ParentBuilderImpl self() {
            return this;
        }

        @Override
        public Parent build() {
            return new Parent(this);
        }
    }
}

@Data
public class Child extends Parent {
    private int grade;

    public static class ChildBuilder extends ParentBuilder<Child, ChildBuilder> {
        private int grade;

        public ChildBuilder grade(int grade) {
            this.grade = grade;
            return this;
        }

        @Override
        public Child build() {
            return new Child(this);
        }

        @Override
        protected ChildBuilder self() {
            return this;
        }

        @Override
        public ChildBuilder from(Parent parent) {
            return parent instanceof ChildBuilder ? (ChildBuilder) parent : super.from(parent).grade(3);
        }
    }

    public static ChildBuilder builder() {
        return new ChildBuilder();
    }

    protected Child(ChildBuilder builder) {
        super(builder);
        this.grade = builder.grade;
    }
}

我们在子类Child中创建了一个新的ChildBuilder类。这个类继承了ParentBuilder,并增加了一个成员变量grade,覆盖了build()和self()方法,用于创建子类实例。

这样我们就可以使用子类的Builder来创建父类和子类的实例了。例如:

Child child = Child.builder()
        .name("John")
        .age(10)
        .grade(5)
        .build();

Parent parent = Child.builder()
        .name("John")
        .age(10)
        .build();

以上是解决Lombok父类和子类Builder兼容性问题的两种方法,可以根据个人喜好和项目需求选择使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决lombok 父类和子类builder不兼容的问题 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • jquery 可拖拽的窗体控件实现代码

    首先,我们需要明白,jquery 是一个 JavaScript 库,它提供了方便的 DOM 操作封装,特别是对于 HTML 文档的遍历和操作、事件的处理、动画和 Ajax 前端数据交互等方面。因此,如果我们想要实现可拖拽的窗体控件,使用 jQuery 会让我们轻松地完成这个需求。 下面是代码的具体实现过程: 实现可拖拽的 div 元素 HTML 代码 &lt…

    other 2023年6月27日
    00
  • 2.3 使用ARDUINO控制MC20进行GPRS的TCP通讯

    使用ARDUINO控制MC20进行GPRS的TCP通讯 本文将为您提供使用ARDUINO控制MC20进行GPRS的TCP通讯的完整攻略,包括硬件连接、软件配置、以及两个示例说明。 硬件连接 以下是使用ARDUINO控制MC20进行GPRS的TCP通讯的硬件连接步骤: 将MC20的VCC引脚连接到ARDUINO的5V引脚。 将MC20的GND引脚连接到ARDU…

    other 2023年5月6日
    00
  • mapwingis介绍

    以下是“MapWinGIS介绍的完整攻略”的标准markdown格式文本,其中包含了两个示例说明: MapWinGIS介绍 MapWinGIS是一个开源的GIS件,可以用于在Windows平台上开发GIS应用程序。本文将介绍MapWinGIS的基本概念和使用方法,包括如添加图层、如何进行地图操作等。 1. 添加图层 在MapWinGIS中,可以通过添加图层来…

    other 2023年5月10日
    00
  • 详解vue过度效果与动画transition使用示例

    详解 Vue 过渡效果与动画 transition 使用示例 1. 什么是 Vue 过渡效果与动画 transition Vue 过渡效果与动画 transition 是 Vue.js 提供的用于实现页面过渡效果和动画的功能。通过在元素上添加 CSS 类名的形式,可以实现各种过渡效果和动画效果。这些效果包括渐变、平移、旋转、缩放等。 在 Vue 中,过渡效果…

    other 2023年6月28日
    00
  • 使用Ajax实时检测”用户名、邮箱等”是否已经存在

    使用Ajax实时检测“用户名、邮箱等”是否已经存在,需要以下几个步骤: 1. 引入jQuery库文件 在HTML文件的<head>标签中引入jQuery库文件: <script src="https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js"></scr…

    other 2023年6月27日
    00
  • windows8系统用户名微软ID和管理员账户概念详解

    Windows 8系统用户名微软ID和管理员账户概念详解 在Windows 8操作系统中,有两个重要的概念:用户名微软ID和管理员账户。本文将详细讲解这两个概念,并提供相关示例说明。 用户名微软ID 用户名微软ID是Windows 8中的一种新用户类型,它的实现是为了与Windows Live和Microsoft在线服务更好地集成。通过使用用户名微软ID,用…

    other 2023年6月27日
    00
  • 讲解Python中for循环下的索引变量的作用域

    讲解Python中for循环下的索引变量的作用域 在Python中,for循环是一种常用的迭代结构,用于遍历可迭代对象(如列表、元组、字符串等)。在for循环中,我们可以使用一个索引变量来追踪当前迭代的位置。然而,需要注意的是,索引变量的作用域在for循环内部。 作用域的概念 作用域是指变量在程序中可访问的范围。在Python中,变量的作用域可以是全局作用域…

    other 2023年8月20日
    00
  • editplus怎么添加到电脑右键菜单? editplus添加到右键的技巧

    在 Windows 操作系统中,将编辑器软件添加到右键菜单可以方便快捷地打开需要进行编辑的文件。下面是如何将 EditPlus 添加到电脑右键菜单的完整攻略: 步骤1:修改注册表 点击“开始”菜单,在搜索框中输入“regedit”,打开“注册表编辑器” 在注册表编辑器中找到以下位置: HKEY_CLASSES_ROOT\*\shell\ 在“shell”目录…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部