@Builder注解在子类中使用遇到的问题

news2024/11/24 2:17:22

场景

在项目开发中,需要基于某个类进行一些字段的拓展,那么自然而然想到的做法是extends该类。而两个类都需要使用@Builder进行构造。代码如下:

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class EmployeeDto {
    private String companyId;
    private String jobNo;
    private Integer gender;
    private Integer age;
}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class HardwareEmployeeDto extends EmployeeDto{
    private String title;
}

使用时:

@GetMapping(value = "/v1/builder/test")
public void testBuilder(){
    HardwareEmployeeDto hardwareEmployeeDto = HardwareEmployeeDto.builder().build();
}

问题

本来想现在直接build一个子类HardwareEmployeeDto,同时也需要给父类赋值,但是此时无法对父类的字段进行赋值,只能给子类的title字段赋值。

在这里插入图片描述

就算只赋值title,编译也会报错

@GetMapping(value = "/v1/builder/test")
public void testBuilder(){
    HardwareEmployeeDto hardwareEmployeeDto = HardwareEmployeeDto.builder().title("Hardware Department").build();
    System.out.println(hardwareEmployeeDto);
}

在这里插入图片描述

这个报错是说明子类尝试申明具有跟父类相同名称的builder,默认的构造器都叫builder(),此时可以给子类的构造器自定义一个新名字,使用子类的构造器进行构造。

@Data
@Builder(builderMethodName = "hardwareEmployeeBuilder")
@AllArgsConstructor
@NoArgsConstructor
public class HardwareEmployeeDto extends EmployeeDto{
    private String title;
}
@GetMapping(value = "/v1/builder/test")
public void testBuilder(){
    HardwareEmployeeDto hardwareEmployeeDto = HardwareEmployeeDto.hardwareEmployeeBuilder().title("Hardware Department").build();
    System.out.println(hardwareEmployeeDto);
}

输出内容

HardwareEmployeeDto(title=Hardware Department)

这样是可以编译通过,正常运行,但是还是无法给父类赋值

解决

  • 子类增加构造函数,通过构造函数给父类字段赋值,并且使用@Builder注解自定义构造器名字
@Data
@AllArgsConstructor
@NoArgsConstructor
public class HardwareEmployeeDto extends EmployeeDto{

    @Builder(builderMethodName = "hardwareEmployeeBuilder")
    public HardwareEmployeeDto(String companyId, String jobNo, Integer gender, Integer age, String title) {
        super(companyId, jobNo, gender, age);
        this.title = title;
    }

    private String title;

}
@GetMapping(value = "/v1/builder/test")
public void testBuilder(){
    HardwareEmployeeDto hardwareEmployeeDto = HardwareEmployeeDto.hardwareEmployeeBuilder()
            .title("Hardware Department")
            .companyId("888")
            .age(18)
            .gender(0)
            .jobNo("1")
            .build();
    System.out.println("jobNo is : " + hardwareEmployeeDto.getJobNo());
}
  • 换成使用@SuperBuilder注解

将子类和父类都换成@SuperBuilder注解,子类也不必指定构造器名称。

@Data
@SuperBuilder
@AllArgsConstructor
@NoArgsConstructor
public class EmployeeDto {
    private String companyId;
    private String jobNo;
    private Integer gender;
    private Integer age;
}
@Data
@SuperBuilder
@AllArgsConstructor
@NoArgsConstructor
public class HardwareEmployeeDto extends EmployeeDto{

    private String title;

}
    @GetMapping(value = "/v1/builder/test")
    public void testBuilder(){
        HardwareEmployeeDto hardwareEmployeeDto = HardwareEmployeeDto.builder()
                .title("Hardware Department")
                .companyId("888")
                .age(18)
                .gender(0)
                .jobNo("1")
                .build();
        System.out.println("jobNo is : " + hardwareEmployeeDto.getJobNo());
    }

注意

  1. @SuperBuilder和@Builder在父类和子类中不能混用
  2. @SuperBuilder在所有的父类和子类中都必须使用上,缺一不可。

另:@SuperBuilder(toBuilder = true)用法

@SuperBuilder的toBuilder默认是false,如果置为true,需要所有的父类也都设置该字段为true。设置了true之后,所有的类的实例会有toBuilder方法,是一个深拷贝的方法,不会覆盖原来的实例的值,而是生成一个新的实例对象赋上新值。

@Data
@SuperBuilder(toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor
public class EmployeeDto {
    private String companyId;
    private String jobNo;
    private Integer gender;
    private Integer age;
}
@Data
@SuperBuilder(toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor
public class HardwareEmployeeDto extends EmployeeDto{

    private String title;

}
@GetMapping(value = "/v1/builder/test")
public void testBuilder(){
    HardwareEmployeeDto hardwareEmployeeDto = HardwareEmployeeDto.builder()
            .title("Hardware Department")
            .companyId("888")
            .age(18)
            .gender(0)
            .jobNo("1")
            .build();
    HardwareEmployeeDto build = hardwareEmployeeDto.toBuilder().jobNo("2").age(28).build();
    System.out.println("jobNo is : " + hardwareEmployeeDto.getJobNo());
    System.out.println("jobNo is : " + build.getJobNo());
}

输出:

jobNo is : 1
jobNo is : 2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详解 Vue3 中如何使用 Proxy 来实现响应式的技术~

详解 Vue3 中如何使用 Proxy 来实现响应式的技术~写在前面剖析 Vue2 中是如何实现响应式的Vue2 的响应式存在什么问题?Vue3 响应式一、ref 函数二、reactive 函数reactive 响应式原理 - ProxyVue3 中的响应式解决了 Vue2 中存在的问题写在前面 Vue3 中的响应式原理…

C++:STL:常见容器:stack,queue, list

一:stack容器 1.1: stack基本概念 概念:stack是一种先进后出 (First in last out FILO)的数据结构,它只有一个出口。 栈中: 1:只有栈顶的元素才可以被外界使用,因此栈不允许有遍历…

从FrameDebugger看Unity渲染

从FrameDebugger看Unity渲染(一) Unity如何渲染一个3D2D的游戏画面,今天通过FrameDebugger来看下Unity内置渲染管线的渲染策略, 后续再出一些URP渲染管线相关的文章。 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白&#xff0c…

MyBatis 实现复杂 Sql 查询

resultMap 结果映射 resultMap 元素是 MyBatis 中最重要最强大的元素&#xff0c;之前所写的 sql 语句&#xff0c;返回值都是简单的基本数据类型或者某一个实体类&#xff0c;比如下面这段 sql 返回的就是最简单的 User 类型。 <select id"getUserById" result…

微信HOOK 协议接口 实战开发篇 3.收发文本消息 附详细步骤

前言&#xff1a;本次文章附带详细的HOOK步骤&#xff0c;感兴趣可以尝试一番 使用了之前文章提到的字符搜索法 接收消息 1.OD打开微信&#xff0c;点击e&#xff0c;进入模块列表 2.双击wechatwin模块进入汇编代码页面 3.右键菜单&#xff0c;选择如图示选项 4.进入字符页…

【 uniapp - 黑马优购 | tabBar】如何创建和配置标签栏

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;讨厌编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;小新爱学习. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc…

zabbix监控redis修正nodata问题

之前根据网上的资料尝试监控redis&#xff0c;完成后编写了文档。 https://blog.csdn.net/bigwood99/article/details/128404063 这几天观察数据&#xff0c;发现没有数据被采集。 在图标中显示no data。 检查模板中item和graphs设置&#xff0c;发现key中没有使用引号。 …

修复U盘【笔记】

修复U盘【笔记】前言参考修复U盘问题0.芯片精灵查看1.用APTool软件擦除量产信息2.用CBMTool量产U盘结果我的版本最后前言 以下内容源自网络 仅供学习交流使用 参考 总体步骤&芯片精灵下载&#xff1a;https://www.xpwin7.com/jiaocheng/25627.html 资源下载网址来源&am…

组织上线 | 资源共享,协作自如

新功能&#xff5e;&#xff01;期待已久的组织协作上线啦&#xff01; 上线后支持在组织下创建镜像&#xff0c;组织成员可查看、拉取镜像&#xff0c;快速实现镜像资源共享&#xff0c;组织高效协同。 具体怎么操作呢&#xff1f;跟我一起来看一下吧&#xff5e; 创建组织 …

Pandas计算历史均值

在用Python进行时间序列分析时&#xff0c;我们可能经常需要计算历史的一些特征。一般会使用rolling()函数&#xff0c;这里介绍一下计算包括当前行的历史特征和不包括当前行的历史特征 1. 包括当前行 这里先简单介绍一下rolling()函数 pandas.DataFrame.rolling官方文档 Dat…

数据库,计算机网络、操作系统刷题笔记19

数据库&#xff0c;计算机网络、操作系统刷题笔记19 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

Vue后台项目的记录 (二)

1、品牌静态管理组件 表单 分页器 2、品牌列表展示 创建相关接口文件 获取品牌管理数据的模块 统一接口管理 在main.js中引入&#xff0c;之后在任意组件中就可以使用了 发请求&#xff0c;获取品牌列表的接口 展示数据 current-change"handlecurrentchange curren…

贤鱼的刷题日常(数据结构队列学习)-2406:Card Stacking--题目详解

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;例题讲解2406:Card Stacking ✅创作者&#xff1a;贤鱼 ⏰预计时间&#xff1a;25分钟 &#x1f389;个人主页&#xff1a;贤鱼的个人主页 &#x1f525;专栏系列&#xff1a;c &#x1f341;贤鱼的个人社区&#xff0c;欢…

LabVIEW如何减少下一代测试系统中的硬件过时5

LabVIEW如何减少下一代测试系统中的硬件过时5 Steps to Replace Instruments Performance Requirements The important consideration to make when replacing instruments isthat the replacements must meet your requirements, usually by having equal orbetter measure…

6.1 微服务-Redis

6.1.1 Redis 6.1.1.1 前言 前面使用到的mysql数据库会出现以下问题 由于用户量增大&#xff0c;请求数量也随之增大&#xff0c;数据压力过大 多台服务器之间数据不同步 多台服务器之间的锁&#xff0c;已经不存在互斥性了。 6.1.1.2 Redis 6.1.1.2.1 什么是Redis Redi…

电脑屏幕录制怎么弄,简单好用的3种电脑录屏方法

平时工作或者学习都需要使用电脑进行录屏操作&#xff0c;比如录制线上网课、游戏画面、教学课程录屏等等。电脑屏幕录制怎么弄&#xff1f;可以使用专业录屏软件或者是电脑自带的屏幕录制功能来录屏&#xff1b;今天给大家分享3款简单好用的电脑录屏方法&#xff1b;无论是录制…

2022知识付费小程序源码升级版知识付费变现小程序独立后台版本源码+数据库和教程

知识付费小程序源码升级版主要功能简介&#xff1a; 本源码后台部分是thinkphp开发的&#xff0c;使用和二次开发都非常方便。 会员系统&#xff1a;用户登录/注册购买记录&#xff0c;收藏记录 基本设置&#xff1a;后台控制导航颜色&#xff0c;字体颜色&#xff0c;标题等…

软件测试面试话术 这样准备,让你成功拿到高薪offer

面试就是就是进入岗位前的临门一脚&#xff0c;如果因为准备不足而导致面试失败那可就亏大了&#xff01;因此&#xff0c;为了帮助大家提高面试成功率&#xff0c;尽快拿到高薪offer&#xff0c;我为你们准备了一套面试话术以及技巧&#xff0c;希望对即将参加软件测试面试的你…

MyBatis一级缓存和二级缓存

缓存的作用 在 Web 系统中&#xff0c;最重要的操作就是查询数据库中的数据。但是有些时候查询数据的频率非常高&#xff0c;这是很耗费数据库资源的&#xff0c;往往会导致数据库查询效率极低&#xff0c;影响客户的操作体验。于是可以将一些变动不大且访问频率高的数据&…

六、Java 13 新特性

六、Java 13 新特性 Java 13 已如期于 9 月 17 日正式发布&#xff0c;此次更新是继半年前 Java 12 这大版本发布之后的一次常规版本更新&#xff0c;在这一版中&#xff0c;主要带来了 ZGC 增强、更新 Socket 实现、Switch 表达式更新等方面的改动、增强。本文主要针对 Java 1…