Java中lombok @Builder注解使用详解

2023-10-29

简介

Lombok大家都知道,在使用POJO过程中,它给我们带来了很多便利,省下大量写get、set方法、构造器、equal、toString方法的时间。除此之外,通过@Builder注解,lombok还可以方便的时间建造者模式。

只需要定义一个静态公共的内部类即可。代码示例如下:

public class User {
    private Integer id;
    private String name;
    private String address;

    private User() {
    }

    private User(User origin) {
        this.id = origin.id;
        this.name = origin.name;
        this.address = origin.address;
    }

    public static class Builder {
        private User target;

        public Builder() {
            this.target = new User();
        }

        public Builder id(Integer id) {
            target.id = id;
            return this;
        }

        public Builder name(String name) {
            target.name = name;
            return this;
        }

        public Builder address(String address) {
            target.address = address;
            return this;
        }

        public User build() {
            return new User(target);
        }
    }
复制代码

如果项目中有使用lombok的话,可以直接使用@Builder注解来实现

改造上面的类如下:

import lombok.Builder;
import lombok.ToString;

/**
 * @author wulongtao
 */
@ToString
@Builder
public class UserExample {
    private Integer id;
    private String name;
    private String address;
}
复制代码

如何使用:

UserExample userExample = UserExample.builder()
                .id(1)
                .name("aaa")
                .address("bbb")
                .build();

System.out.println(userExample);
复制代码

遇到问题

在使用@Builder过程中,发现了一问题:子类的Builder对象没有父类的属性。这在使用上造成了一定的问题。

对于这个问题,找到了如下解法

  1. 对于父类,使用@AllArgsConstructor注解
  2. 对于子类,手动编写全参数构造器,内部调用父类全参数构造器,在子类全参数构造器上使用@Builder注解

通过这种方式,子类Builder对象可以使用父类的所有私有属性。
但是这种解法也有两个副作用:

  • 因为使用@AllArgsConstructor注解,父类构造函数字段的顺序由声明字段的顺序决定,如果子类构造函数传参的时候顺序不一致,字段类型还一样的话,出了错不好发现
  • 如果父类字段有增减,所有子类的构造器都要修改

虽然有这两个副作用,但是这种解法是我找到的唯一一种解决子类使用@Builder,能使用父类属性的方式。

参考博客评论: Lombok’s @Builder annotation and inheritance

如何在使用@Builder的模式中,加入字段的默认值。因为使用了建造者模式,那么一般在类内声明字段的时候给字段默认值的方式就是无效的,需要在建造者上动手脚。

  1. 自定义静态内部类作为建造者,赋予默认值,再使用@Builder注解,这个时候lombok会补全已有的建造者类,进而使用默认值
  2. 更新的lombok有@Builder.Default声明,注解在需要默认值的字段上即可。

在评论区也有这种方式的副作用讨论,链接是: Using Lombok’s @Builder annotation with default values

转载于:https://juejin.im/post/5cdb8422e51d453adf1fa72d

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中lombok @Builder注解使用详解 的相关文章

随机推荐

  • CTF的区块链入门资料

    文章目录 编写课件的心路历程 第一阶段 第二阶段 题目列表 靶场Security Innovation Blockchain CTF 合约逆向 其他 常用平台 区块链安全公司相关 编写课件的心路历程 第一阶段 查找半个小时 发现CTF区块链
  • Java8 Stream 分组求和使用笔记

    Java8 Stream 分组求和使用笔记 话不多说 直接贴代码 分组使用 class Foo private int code private int count public Foo int code int count this co
  • APS系列:二

    距上篇居然快一年了 汗 阶段总结真的不能停 否则过阵子就彻底淡忘了 年纪渐长 记性也指数下降 话说APS这个话题我已脱手半年多 懒是病 得治 APS在工业界 特别是制造行业是非常重要和核心的 可惜在学术界并不是研究热点 除了少数几个贼贵的行
  • jQuery 入门教程(32): jQuery UI Datepicker 示例(五)

    设置可以选择的日期范围 有时希望用户在给定的日期内选择 比如预约会议的时间 只能在当天开始的一个月带10天以内 这时可以通过配置minDate和maxDate 来设置 如果minDate或maxDate 没有配置 表示没有最小日期或最大日期
  • C语言最佳实践(B站学习)更新

    接口设计模式 为独立的网络请求模块设计的接口 select接口 不如epoll好 epoll 解决了select问题 将一个多个监听描述符的行为再抽象为一个文件描述符的监听 包括指针一起封装起来 浏览器的 从网络获取数据功能运行独立的网络进
  • Stable Diffusion控制人物脸部和手的方法

    目前Stable Diffusion在人体姿态控制方面已经取得了比较稳定的效果 但是在人脸和手部姿势的控制上还没有很好的解决 经常会出现崩手和崩脸的情况 01 After Detailer解决崩脸的问题 After Detailer是sd的
  • 梳理mavan使用流程,利用IDEA使用maven引入servlet包

    maven的引入 传统方式引入包 缺点 1 程序员自己手动导入包 2 自己解决版本冲突问题 3 自己解决相互依赖问题 4 自己解决包之间的冲突问题 因为包的导入的缺点 设计出更好 更简单的辅助管理程序 maven 大概的流程 利用IDEA使
  • ctfshow(web入门1-28)

    CTF SHOW 信息搜集 参考 https blog csdn net a597934448 article details 105431367 web1 右键查看源码得到flag web2 无法右键和F12查看源码 复制view sou
  • -bash: mysql: command not found

    问题描述 原因描述 系统默认会查找 usr bin下的命令 如果这个命令不在这个目录下 当然会找不到命令 我们需要做的就是映射一个链接到 usr bin目录下 相当于建立一个链接文件 解决方法 首先得知道mysql命令或mysqladmin
  • Struts2+MyBatis3.1.0+Spring3.1.0 整合之道一:数据映射器整合

    第一步 导入相应的jar包 第二步 Web xml文件中整合Struts2和Spring3 1 0
  • 表达式求值-递归

    表达式由项组成 项由因子组成 include
  • Sql Server Profiler Sql 事件探查器 使用方法

    如何进入事件探查器 开始 程序 SQL Server 2008 R2 Sql Server Profiler 点击打开可视窗口 点击新建事件跟踪 输入数据库用户名和密码 事件探查器重要列名解释 CPU 事件所使用的 CPU 时间总计 以毫秒
  • 微信小程序 本地资源图片无法通过 WXSS 获取,可以使用网络图片,或者 base64,或者使用image标签。

    微信小程序不能使用background image问题解决 报错信息 pages index index wxss 中的本地资源图片无法通过 WXSS 获取 可以使用网络图片 或者 base64 或者使用
  • 从零开始搭建vue项目 (晋级篇) npm run dev npm run build

    目录 一 前言 1 目标 2 搭建思路 3 环境准备 二 基础知识 1 包配置安装 npm install 2 运行项目 npm run dev 2 1 执行npm run dev 2 2 调用入口文件 webpack dev conf j
  • idea插件之Smart Tomcat

    IDEA中Smart Tomcat的部署和配置 由于idea版本原因需要自己安装Tomcat插件 但只有Smart Tomcat 并且与之前Tomcat的部署差别有点大 折腾了三个小时终于完成 分享下踩过的坑 社区版 1 安装smart t
  • Java——基础语法(二)

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 React从入门到精通 前端炫酷代码分享 从0到英雄 vue成神之路 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架
  • iexplore.exe命令行参数解释

    打开C Program Files Internet Explorer文件夹 右击iexplore exe文件 选择 发送到 桌面快捷方式 再右击桌面上新建的快捷方式 选择 属性 即可在目标输入框后面添加参数 要注意的是 程序名和参数之间要
  • 【Elasticsearch学习笔记-基础篇2】Elasticsearch倒排索引、分析及打分

    前言 Elasticsearch学习笔记 基础篇1 Elasticsearch介绍及设计概念 在之前的一篇文章中 简单介绍了 es 的设计和相关概念 这一篇来介绍一下 es 中实操方面相关概念的引申 在索引和搜索文档的时候 es 是怎么做的
  • QT6中不再支持使用的类和方法,兼容但不可用

    以下为QT6版本不支持的C 类 首字母标签不带Q D QDiffuseMapMaterial Qt3DExtras QDiffuseSpecularMapMaterial Qt3DExtras G QGraphicsItemAnimatio
  • Java中lombok @Builder注解使用详解

    简介 Lombok大家都知道 在使用POJO过程中 它给我们带来了很多便利 省下大量写get set方法 构造器 equal toString方法的时间 除此之外 通过 Builder注解 lombok还可以方便的时间建造者模式 只需要定义