Lombok使用@Builder无法build父类属性

news2024/9/29 15:29:49

文章目录

    • 问题描述
    • 解决方案
    • 使用示例
    • lombok @Builder注解和build父类属性问题
      • 1、简介
      • 2.使用
      • 3、@Builder注解对类做了什么?

问题描述

实体类使用Lombok的@Builder来实现Builder模式,但是如果使用了extend继承,则子类无法通过Builder来Build父类属性值

解决方案

父类增加@NoArgsConstructor、@AllArgsConstructor注解来增加无参和全参构造函数【注:父类属性不能设置为private,否则仍然无法访问,父类不允许有@Builder注解,否则会和子类冲突】

子类增加@NoArgsConstructor来增加无参构造函数,自定义一个全参构造函数(包含父类属性)

使用示例

父类:

package com.baijia.uqun.individual.management.facade;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
 * @Author C.W
 * @Date 2020/6/15 5:25 下午
 * @Description 父类
 */
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Father {
    /**
     * 父类名称
     */
    public String fatherName;
}

子类:

package com.baijia.uqun.individual.management.facade;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
 * @Author C.W
 * @Date 2020/6/15 5:26 下午
 * @Description 子类
 */
@Setter
@Getter
@NoArgsConstructor
public class Child extends Father {
    /**
     * 子类名称
     */
    private String childName;
    /**
     * 用于解决Lombok的Builder无法Build父类属性问题
     *
     * @param fatherName
     * @param childName
     */
    @Builder(toBuilder = true)
    public Child(String fatherName, String childName) {
        super(fatherName);
        this.childName = childName;
    }
}

使用:

package com.baijia.uqun.individual.management.facade;
/**
 * @Author C.W
 * @Date 2020/6/15 5:28 下午
 * @Description 测试代码
 */
public class Test {
    public static void main(String[] args) {
        // 创建一个子类
        Child child = Child.builder()
                .fatherName("父类名称")
                .childName("子类名称")
                .build();
        System.out.println(String.format("父类名称:%s,子类名称:%s", child.getFatherName(), child.getChildName()));
    }
}

lombok @Builder注解和build父类属性问题

1、简介

通过@Builder注解,lombok可以方便的实践建造者模式。

2.使用

1)创建基类User

import lombok.*;
/**
 * @author Saint
 */
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
    private Long id;
    private String name;
}

2)创建子类UserExt

import lombok.*;
/**
 * @author Saint
 */
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class UserExt extends User{
    private String address;
    private Integer age;
}

3)分别使用Builder创建父类和子类

// 父类
User user = User.builder().id(1L).name("saint").build();
// 子类
UserExt userExt = UserExt.builder().address("南京").age(18).build();

3、@Builder注解对类做了什么?

反编译后的UserExt.class:

public class UserExt extends User {
    private String address;
    private Integer age;
    public static UserExt.UserExtBuilder builder() {
        return new UserExt.UserExtBuilder();
    }
    public String getAddress() {
        return this.address;
    }
    public Integer getAge() {
        return this.age;
    }
    public void setAddress(final String address) {
        this.address = address;
    }
    public void setAge(final Integer age) {
        this.age = age;
    }
    public UserExt() {
    }
    public UserExt(final String address, final Integer age) {
        this.address = address;
        this.age = age;
    }
    public String toString() {
        return "UserExt(address=" + this.getAddress() + ", age=" + this.getAge() + ")";
    }
    public static class UserExtBuilder {
        private String address;
        private Integer age;
        UserExtBuilder() {
        }
        public UserExt.UserExtBuilder address(final String address) {
            this.address = address;
            return this;
        }
        public UserExt.UserExtBuilder age(final Integer age) {
            this.age = age;
            return this;
        }
        public UserExt build() {
            return new UserExt(this.address, this.age);
        }
        public String toString() {
            return "UserExt.UserExtBuilder(address=" + this.address + ", age=" + this.age + ")";
        }
    }
}

注解在编译后使UserExt类中多了一个名为UserExt.UserExtBuilder的静态内部类。这个静态类拥有和UserExt类相同的属性,并且他额外实现了一些方法:

1.address、age的属性方法

其实这些方法和setAttribute十分类似,只是额外返回了实例本身,这使得它可以使用类似于链式调用的写法。

2.build方法

该方法调用UserExt类的全参构造方法来生成UserExt实例。

UserExt类还是实现了builder方法,这个方法生成一个空的UserExt.UserExtBuilder实例。

4、优缺点
优点:
写法更优雅,不需要太多的set方法设置属性。

缺点:
在生成UserExt实例之前,先创建了一个UserExt.UserExtBuilder实例,其占用了额外的内存。并且Java是按值传递,我们可以直接修改引用对象,不用新建一个对象再赋值;而Builder.build()方法每次调用都会new一个实例出来。

5、问题:@Builder注解不能 build 父类属性
从反编译后的UserExt类可以看出,UserExtBuilder并没有从父类User继承来的属性:id、name的填充方法。
在这里插入图片描述
解决方案:

在子类和父类中都使用@SuperBuilder,去掉@Builder。但从import的包中也能看到@SuperBuilder注解是experimental实验性的。不知道会不存存在什么潜在风险,慎用。
在这里插入图片描述
从反编译后的User 和UserExt类来看:

public abstract static class UserBuilder<C extends User, B extends User.UserBuilder<C, B>>
public abstract static class UserExtBuilder<C extends UserExt, B extends UserExt.UserExtBuilder<C, B>> extends UserBuilder<C, B>

lombok对UserBuilder 与 UserExtBuilder做了继承关系

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

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

相关文章

深度学习应用技巧4-模型融合:投票法、加权平均法、集成模型法

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下&#xff0c;深度学习中的模型融合。它是将多个深度学习模型或其预测结果结合起来&#xff0c;以提高模型整体性能的一种技术。 深度学习中的模型融合技术&#xff0c;也叫做集成学习&#xff0c;是指同时使用多个…

CentOS7.5(1804)安装vsftpd(ftp)

1.准备安装包 1. vsftpd-3.0.2-29.el7_9.x86_64.rpm 2. ftp-0.17-67.el7.x86_64.rpm 可以自行下载,也可从我的博客中下载,下载传送门点 这里 2.安装vsftpd #1. 上传文件到服务器上,比如/home目录 #2. 执行以下命令安装 rpm -ivh vsftpd-3.0.2-29.el7_9.x86_64.rpm #3. 启动vsf…

极限的无穷小和无穷大

目录 无穷小&#xff1a; 无穷大&#xff1a; 无穷小&#xff1a; 举几个无穷小量的例子&#xff1a; 以0为极限的意思就是无穷小。 注&#xff1a;无穷小是变量&#xff0c;不能把很小很小的数混为一谈。 2&#xff1a;0是可以作为无穷小的唯一的一个数。 我们进行证明&…

完整教程:使用Spring Boot实现大文件断点续传及文件校验

一、简介 随着互联网的快速发展&#xff0c;大文件的传输成为了互联网应用的重要组成部分。然而&#xff0c;由于网络不稳定等因素的影响&#xff0c;大文件的传输经常会出现中断的情况&#xff0c;这时需要重新传输&#xff0c;导致传输效率低下。 为了解决这个问题&#xff…

【敏捷开发】jenkins「CI持续集成 CD持续部署」

文章目录前言一、安装jenkins1. 部署中的痛点2. 什么是jenkins3. jenkins的安装和配置&#xff08;1&#xff09;下载&#xff08;2&#xff09;安装二、上传到运行服务器1. jenkins构建服务器流程2. 安装jenkins常用插件3. 通过freestyle构建项目4. 将构建服务器上的代码上传到…

ASA材料3D打印服务 抗紫外线材料3D打印服务 抗紫外线模型制作-CASAIM中科院广州电子

3D打印技术又称增材制造&#xff0c;通常是采用数字技术材料打印机来实现的&#xff0c;常在模具制造、工业设计等领域被用于制造模型&#xff0c;后逐渐用于一些产品的直接制造。随着 3D 打印逐渐成为主流生产流程的一部分&#xff0c;ASA抗紫外线材料应运而生。中科院广州电子…

Ubuntu 搭建NextCloud私有云盘【内网穿透远程访问】

文章目录1.前言2.本地软件安装2.1 nextcloud安装2.2 cpolar安装3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置4.公网访问测试5. 结语1.前言 对于爱好折腾的电脑爱好者来说&#xff0c;Linux是绕不开的、必须认识的系统&#xff08;大部分服务器都是采用Linux操作系统&a…

华为OD机试题,用 Java 解【数组二叉树】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…

将生成的NYUv2边界GT加载到dataloader中并进行训练

由上一篇我们可以知道&#xff0c;我们生成了一个label_img文件夹&#xff0c;里面存放的是索引对应图片的filename&#xff0c;每个filename里面存放的是GT的40个通道的边缘GT。train里面是这样&#xff0c;test里面也是这样。 加载数据我们要到train文件的dataloader中&…

Azure AD 与 AWS 单一帐户SSO访问集成,超详细讲解,包括解决可能出现的错误问题

本教程介绍如何将 AWS Single-Account Access 与 Azure Active Directory (Azure AD) 相集成。 将 AWS Single-Account Access 与 Azure AD 集成后&#xff0c;可以&#xff1a; 在 Azure AD 中控制谁有权访问 AWS Single-Account Access。让用户使用其 Azure AD 帐户自动登录…

SwiftUI 常用组件和属性(SwiftUI初学笔记)

本文为初学SwiftUI笔记。记录SwiftUI常用的组件和属性。 组件 共有属性(View的属性) Image("toRight").resizable().background(.red) // 背景色.shadow(color: .black, radius: 2, x: 9, y: 15) //阴影.frame(width: 30, height: 30) // 宽高 可以只设置宽或者高.…

2023年上半年软考中/高级一起报名考试+备考学习

软考是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资格考试。 系统集成…

Springboot——自定义Filter使用测试总结

文章目录前言自定义过滤器并验证关于排除某些请求的方式创建测试接口请求测试验证异常过滤器的执行流程注意事项资料参考前言 在Java-web的开发领域&#xff0c;对于过滤器和拦截器用处还是很多&#xff0c;但两者的概念却极易混淆。 过滤器和拦截器都是采用AOP的核心思想&am…

【微服务】—— 初识微服务

文章目录1. 什么是微服务1.1 微服务的特性自主专用性1.2 微服务的优势敏捷性灵活扩展轻松部署技术自由可重复使用的代码弹性2. 微服务技术栈3. 微服务架构演进3.1 单体架构3.2 分布式架构服务治理3.3 微服务微服务结构微服务技术对比企业需求1. 什么是微服务 微服务是一种开发软…

【删繁就简】Echarts 视觉映射组件中国地图分段颜色显示,选中范围内外颜色设置策略

【删繁就简】Echarts 视觉映射组件中国地图分段颜色显示&#xff0c;选中范围内外颜色设置策略一、背景二、增加0值分段配置项三、解决方案3.1 更改地图底色3.2 更改outOfRange配置项一、背景 在前端项目开发过程中&#xff0c;需要在大屏模块模块中按照项目在各省份分部的数量…

【100个 Unity实用技能】 ☀️ | 脚本无需挂载到游戏对象上也可执行的方法

Unity 小科普 老规矩&#xff0c;先介绍一下 Unity 的科普小知识&#xff1a; Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…

关于Go语言的底层,你想知道的都在这里!

文章目录1. GoLang语言1.1 Slice1.2 Map1.3 Channel1.4 Goroutine1.5 GMP调度1.6 垃圾回收机制1.7 其他知识点2. Web框架Gin和微服务框架Micro2.1 Gin框架2.2 Micro框架2.3 Viper2.4 Swagger2.5 Zap2.6 JWT文章字数大约1.95万字&#xff0c;阅读大概需要65分钟&#xff0c;建议…

洗牌发牌-第14届蓝桥杯STEMA测评Scratch真题精选

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第105讲。 蓝桥杯选拔赛现已更名为STEMA&#xff0c;即STEM 能力测试&#xff0c;是蓝桥杯大赛组委会与美国普林斯顿多…

docker从安装到部署一个项目

一.centos安装docker 参考博客&#xff1a;https://blog.csdn.net/m0_47010003/article/details/127775185 1.设置一下下载Docker的镜像源 设置下载的镜像源为国内的阿里云&#xff0c;如果不设置&#xff0c;会默认去Docker的官方下载 yum-config-manager --add-repo http…

飞桨携手Hugging Face共建开源社区,文图生成黑科技画你所想!

最近的 AIGC 有多火&#xff0c;你不会不知道吧&#xff1f; AI绘画收到越来越多关注的同时&#xff0c;你想不想自己试试&#xff1f;如何基于开源项目训练自己的趣味模型&#xff0c;开源出来被更多人看到&#xff1f; 在这个人人都是创作家的时代&#xff0c;你可以脑洞大开…