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

当使用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日

相关文章

  • fpga开发详细流程你了解吗?

    以下是“FPGA开发详细流程你了解吗?”的完整攻略,包括过程中的两个示例说明。 FPGA开发详细流程 FPGA是一种可编程逻辑器件,可以用于实现各种数字电路。在进行FPGA开发时,需要掌握一些基础知识和开发流程。以下是一份关于FPGA开发详细流程的攻略。 1. FPGA基础知识 在开始FPGA开发之前,我们需要掌握一些基础知识,例如: FPGA的基础知识,包…

    other 2023年5月10日
    00
  • 解决SpringBoot application.yaml文件配置schema 无法执行sql问题

    在 SpringBoot 中我们通常会使用 application.yaml 或 application.properties 作为项目的配置文件,其中可以配置数据源信息、SQL 语句等信息。但是在实际使用中,有些同学会遇到一些问题,比如 application.yaml 中配置 SQL 语句无法执行的问题。下面我将分享一下解决这个问题的攻略: 问题原因 在…

    other 2023年6月25日
    00
  • mybatis 返回Map类型key默认为大写问题

    MyBatis 返回 Map 类型 key 默认为大写问题攻略 在 MyBatis 中,当使用 select 语句返回 Map 类型的结果时,默认情况下,Map 的键(key)会被转换为大写形式。这可能会导致一些问题,特别是当数据库中的列名是小写或者混合大小写时。下面是解决这个问题的完整攻略。 解决方法 方法一:使用别名 在 SQL 查询语句中,可以使用别名…

    other 2023年8月19日
    00
  • java必学必会之网络编程

    Java必学必会之网络编程攻略 一、网络基础概念 1.1 OSI七层模型 OSI七层模型是一种通用的网络协议分层模型,分为七层。自下而上分别为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。Java通常使用的是传输层到应用层。 1.2 TCP/IP协议 TCP/IP协议比OSI七层模型更常用。分为四层:网络接口层、网络层、传输层、应用层。Jav…

    other 2023年6月27日
    00
  • ASP获取数据库表名、库名、字段名的方法

    获取数据库表名、库名、字段名是网站开发中常见的需求。在ASP中,可以通过ADO对象的属性和方法来实现。下面是具体的完整攻略: 获取数据库库名 要获取一个数据库的库名,在连接数据库的字符串(ConnectionString)中加入“Initial Catalog=数据库名”即可。然后,打开连接,通过Connection对象的属性Catalog获取库名。 示例代…

    other 2023年6月26日
    00
  • dotnetrun命令介绍

    以下是“hue安装与使用的完整攻略”的标准markdown格式文本,其中包含了两个示例说明: Hue安装与使用 Hue是一个开源的Web界面,用于管理Apache Hadoop集群。本文将介绍如何安装和使用Hue,包括如何安装Hue、如何配置Hue和如何使用Hue。 1. 安装Hue 以下是安装Hue的步骤: 下载Hue的安装包。 解压安装包。 进入解压后的…

    other 2023年5月10日
    00
  • 魔兽世界9.0法夜圣所指挥台在哪 法夜圣所指挥台位置坐标

    魔兽世界9.0法夜圣所是新资料片“影之哀伤”中新增的副本,该副本中有一处重要的位置——指挥台。以下是“魔兽世界9.0法夜圣所指挥台在哪 法夜圣所指挥台位置坐标”的完整攻略。 1. 到达法夜圣所 首先,我们需要前往法夜圣所。法夜圣所位于达纳苏斯的右下方海域,可以通过传送门和飞行点到达。进入法夜圣所后,我们需要找到指挥台所在的位置。 2. 寻找指挥台 指挥台位于…

    other 2023年6月27日
    00
  • 深入聊聊MySQL中各种对象的大小长度限制

    MySQL中各种对象的大小长度限制 MySQL中的各种对象都有其自身的大小和长度限制,了解这些限制可以帮助开发人员更好地规划数据库结构和存储数据。本文将深入探讨MySQL中常见对象的大小长度限制。 字符串类型 字符串类型是MySQL中最常用的数据类型之一,以下是各个字符串类型的大小限制: CHAR: 最长可达255个字节,为定长类型,所以占用空间为固定长度。…

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