当前位置: 首页 > article >正文

JAVA重点基础、进阶知识及易错点总结(36)Lombok 实战 + 阶段总结

Java 巩固进阶 · 第 36 天主题Lombok 实战 阶段总结 —— 解放双手高效开发 进度概览今天是设计模式与注解阶段31-36 天的最后一天也是Java 基础巩固阶段的收官之日学习 Lombok 提升开发效率并全面复盘本阶段知识。 核心价值效率提升用注解自动生成 get/set/构造器减少 80% 样板代码。代码整洁类只关注业务逻辑不含 getter/setter 等噪音代码。原理理解了解注解处理器APT工作机制深化对编译期的理解。阶段复盘梳理设计模式与注解知识体系为 SpringBoot 学习做好准备。一、Lombok 核心注解一行顶百行 ️1. 什么是 Lombok┌─────────────────────────────────────┐ │ Lombok 本质 │ │ 是一个注解库编译时自动生成代码 │ │ │ │ • 减少样板代码get/set/构造器等 │ │ • 通过注解处理器APT实现 │ │ • 编译后字节码包含生成的代码 │ └─────────────────────────────────────┘2. 核心注解速查表⭐ 必背注解作用等价手写代码使用频率Data生成 get/set/toString/equals/hashCode全部⭐⭐⭐⭐⭐Getter/Setter生成 get 或 set 方法get/set 方法⭐⭐⭐⭐NoArgsConstructor生成无参构造器public Class() {}⭐⭐⭐⭐AllArgsConstructor生成全参构造器public Class(所有字段) {}⭐⭐⭐⭐RequiredArgsConstructor生成 required 构造器final 字段public Class(final 字段) {}⭐⭐⭐Builder生成建造者模式代码Builder 内部类⭐⭐⭐⭐ToString生成 toString 方法toString()方法⭐⭐⭐EqualsAndHashCode生成 equals/hashCodeequals/hashCode()方法⭐⭐⭐Slf4j生成 log 日志对象private static final Logger...⭐⭐⭐⭐⭐3. 实战对比手写 vs Lombok// ❌ 传统手写约 50 行代码publicclassUser{privateLongid;privateStringname;privateIntegerage;publicUser(){}publicUser(Longid,Stringname,Integerage){this.idid;this.namename;this.ageage;}publicLonggetId(){returnid;}publicvoidsetId(Longid){this.idid;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicIntegergetAge(){returnage;}publicvoidsetAge(Integerage){this.ageage;}OverridepublicStringtoString(){returnUser{idid, namename, ageage};}Overridepublicbooleanequals(Objecto){if(thiso)returntrue;if(onull||getClass()!o.getClass())returnfalse;Useruser(User)o;returnObjects.equals(id,user.id);}OverridepublicinthashCode(){returnObjects.hash(id);}}// ✅ Lombok 版约 10 行代码DataNoArgsConstructorAllArgsConstructorBuilderpublicclassUser{privateLongid;privateStringname;privateIntegerage;}效率对比代码量减少80%可读性提升50%维护成本降低70%二、Lombok 原理注解处理器APT1. 编译流程图解源码 (.java Lombok 注解) ↓ javac 编译 ↓ 注解处理器 (Lombok APT) ↓ 生成代码 (get/set/构造器等) ↓ 合并到抽象语法树 (AST) ↓ 生成字节码 (.class) ↓ 运行时普通 Java 类无 Lombok 依赖2. 关键特性// ✅ 编译时生成运行时没有 Lombok 依赖// ✅ 字节码完整IDE 和运行时都能正常调用 get/set// ✅ 无性能损耗生成的代码与手写等价// ⚠️ 注意// 1. IDE 需安装 Lombok 插件否则提示找不到方法// 2. 编译时需添加 Lombok 依赖// 3. 反编译.class 文件能看到生成的方法3. Maven/Gradle 配置!-- Maven 依赖 --dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.30/versionscopeprovided/scope/dependency// Gradle 依赖 compileOnly org.projectlombok:lombok:1.18.30 annotationProcessor org.projectlombok:lombok:1.18.30三、⚠️ 注意事项与避坑指南1. 常见坑点// ❌ 坑 1Data 继承 equals/hashCode 问题DatapublicclassParent{privateStringname;}DatapublicclassChildextendsParent{privateIntegerage;}// 问题子类 equals 不包含父类字段// ✅ 解决用 EqualsAndHashCode(callSuper true)DataEqualsAndHashCode(callSupertrue)publicclassChildextendsParent{...}// ❌ 坑 2Builder NoArgsConstructor 冲突BuilderpublicclassUser{...}// 问题Builder 会生成全参构造与无参构造冲突// ✅ 解决显式添加 NoArgsConstructorBuilderNoArgsConstructorAllArgsConstructorpublicclassUser{...}// ❌ 坑 3Data JPA 实体 性能问题DataEntitypublicclassUserEntity{...}// 问题Data 生成的 equals/hashCode 可能导致懒加载触发// ✅ 解决JPA 实体只生成 getId 的 equals/hashCodeEqualsAndHashCode(onlyExplicitlyIncludedtrue)DataEntitypublicclassUserEntity{EqualsAndHashCode.IncludeprivateLongid;}2. 最佳实践建议场景推荐注解说明普通 DTO/VOData最常用生成全部方法实体类JPAGetter/Setter 自定义EqualsAndHashCode避免懒加载问题不可变对象Value类似Data但字段默认 final构建复杂对象Builder链式调用代码优雅日志对象Slf4j自动生成log对象四、 今日实战任务Lombok 重构练习任务 1用 Lombok 重构用户类/** * 要求 * 1. 找到之前手写的 User 类含 get/set/构造器/toString * 2. 用 Data NoArgsConstructor AllArgsConstructor 替代 * 3. 添加 Builder测试链式创建对象 * 4. 添加 Slf4j在方法中使用 log.info() * * 提示 * 确保 IDE 已安装 Lombok 插件 * 编译后反编译.class 文件查看生成的方法 */任务 2Lombok 与继承/** * 业务场景父类 子类的 equals/hashCode 问题 * * 要求 * 1. 创建 Parent 类Data含 name 字段 * 2. 创建 Child 类继承 ParentData含 age 字段 * 3. 测试两个 Child 对象name 和 age 相同equals 是否返回 true * 4. 用 EqualsAndHashCode(callSuper true) 修复问题 * * 思考 * 为什么子类 equals 默认不包含父类字段 */任务 3Lombok 与 JPA 实体/** * 业务场景Spring Data JPA 实体类 * * 要求 * 1. 创建 UserEntity 类添加 Entity Id 注解 * 2. 使用 Getter/Setter 替代 Data * 3. 使用 EqualsAndHashCode(onlyExplicitlyIncluded true) * 4. 只将 id 字段包含在 equals/hashCode 中 * * 提示 * 这是 SpringBoot JPA 的最佳实践 */任务 4Lombok 原理探索/** * 要求 * 1. 创建一个简单的 Data 类 * 2. 编译项目找到生成的.class 文件 * 3. 用反编译工具如 IDEA 内置或 javap查看字节码 * 4. 记录生成了哪些方法与手写的是否一致 * * 命令 * javap -c -p User.class */ 第 36 天 · 核心总结极简背诵版Lombok 核心注解Data// get/set/toString/equals/hashCodeBuilder// 建造者模式NoArgsConstructor// 无参构造AllArgsConstructor// 全参构造Slf4j// 日志对象Lombok 原理注解处理器APT→ 编译时生成代码 → 合并到 AST → 生成字节码 运行时无 Lombok 依赖无性能损耗避坑指南继承EqualsAndHashCode(callSuper true) JPA 实体避免Data用Getter/Setter 自定义 equals Builder 冲突同时加 NoArgsConstructor最佳实践✅ DTO/VO 用 Data✅ 实体类用 Getter/Setter 自定义 EqualsAndHashCode✅ 日志用 Slf4j❌ 避免过度使用关键逻辑仍需手写 恭喜Java 基础巩固阶段1-36 天正式完结 完整知识地图复盘 第 1 阶段Java 基础巩固1-36 天 │ ├─ 第 1-6 天语法与面向对象 │ ├─ 数据类型/流程控制/数组/字符串 │ ├─ 封装/继承/多态/抽象类/接口 │ └─ 异常处理体系 │ ├─ 第 7-12 天集合框架 │ ├─ List (ArrayList/LinkedList) │ ├─ Set (HashSet/TreeSet) │ ├─ Map (HashMap/ConcurrentHashMap) │ └─ 泛型与工具类 │ ├─ 第 13-18 天IO 流与日期时间 │ ├─ 字节流/字符流/缓冲流/转换流 │ ├─ File 文件操作 │ └─ JDK8 日期 APILocalDate/DateTimeFormatter │ ├─ 第 19-24 天多线程与反射 │ ├─ 线程创建/同步/通信/线程池 │ ├─ Callable/Future/CompletableFuture │ ├─ 反射基础 (Class/Field/Method) │ └─ 反射进阶 注解初探 │ ├─ 第 25-30 天JDK8 新特性 │ ├─ Lambda 表达式 │ ├─ Stream 流式编程 │ ├─ Optional 空值处理 │ ├─ 接口默认/静态方法 │ └─ JDK9-11 新特性 │ └─ ️ 第 31-36 天设计模式与注解 ├─ 单例/工厂/建造者/原型 ├─ 代理/装饰器 ├─ 注解基础与自定义 ├─ 注解 反射实战 └─ Lombok 高效开发 高频面试题清单自测 30 题分类面试题集合HashMap 底层结构JDK7 与 JDK8 区别集合ArrayList 扩容机制LinkedList 适用场景集合ConcurrentHashMap 如何保证线程安全并发synchronized 与 ReentrantLock 区别并发volatile 关键字作用能保证原子性吗并发线程池 7 大参数拒绝策略有哪些并发ThreadLocal 原理内存泄漏问题IOBIO/NIO/AIO 区别IO缓冲流为什么比普通流快JDK8Lambda 表达式本质函数式接口有哪些JDK8Stream 中间操作与终止操作区别JDK8Optional 使用禁忌反射反射获取 Class 的三种方式反射反射破坏单例如何防御设计模式单例模式几种实现双重检查锁为什么需要 volatile设计模式工厂模式与抽象工厂区别设计模式代理模式与装饰器模式区别设计模式JDK 动态代理与 CGLIB 区别注解元注解有哪些Retention 三种策略区别注解如何通过反射读取注解信息其他String 为什么不可变其他 与 equals() 区别其他接口与抽象类区别其他重载与重写区别其他深克隆与浅克隆区别其他检查异常与非检查异常区别其他final/finally/finalize 区别其他静态方法与实例方法区别其他序列化与反序列化serialVersionUID 作用其他Java 反射的性能开销及优化恭喜你完成了 Java 基础的系统性巩固继续加油✨

相关文章:

JAVA重点基础、进阶知识及易错点总结(36)Lombok 实战 + 阶段总结

🚀 Java 巩固进阶 第 36 天 主题:Lombok 实战 阶段总结 —— 解放双手,高效开发📅 进度概览:今天是 设计模式与注解阶段(31-36 天)的最后一天,也是 Java 基础巩固阶段的收官之日&a…...

论文AI率80%+的紧急处理方案,答辩前用得上

距离答辩3天,AI率检出80%——这是最糟糕的时间点碰到最糟糕的问题。 不要慌,这个情况有成熟的处理方案,我见过很多人在这个时间节点成功降下来的。下面是紧急情况下的处理方法,按照时间紧迫程度分了几个场景。 先做一个判断&…...

JAVA重点基础、进阶知识及易错点总结(35)注解与反射

🚀 Java 巩固进阶 第 35 天 主题:注解与反射结合 —— 让注解"活"起来📅 进度概览:继昨天学习注解定义之后,今天进入 注解的核心应用场景:注解 反射。单独的注解只是"标签"&#xff…...

AI率超80%不要慌,这样处理比自己改快10倍

看到AI率80%,第一反应是慌乱,这完全正常。但慌乱之后,做什么决定很关键。 这篇文章只说一件事:为什么用工具处理比自己改快10倍,怎么用工具最快解决这个问题。 手动改写的真实速度 先来做一个计算。 一个写作速度正…...

JAVA重点基础、进阶知识及易错点总结(34)注解基础(Annotation)

🚀 Java 巩固进阶 第 34 天 主题:注解基础(Annotation)—— 代码的"元数据"标签📅 进度概览:继设计模式之后,今天学习 Java 注解体系。注解是"代码的标签",是 …...

AI 编程 Harness 框架深度拆解(非常详细),6 大框架从入门到精通,收藏这一篇就够了!

AI 会写,不等于 AI 能稳定交付。 前段时间我们都在说 Vibe Coding,大家都知道是氛围编程的意思,但是现在也有叫“直觉编程”。什么叫直觉编程,就是完全不用管其它的,想到什么就做什么,主打一个靠直觉写代码…...

多模态整合进阶必读:MIT APOLLO框架核心思想(非常详细),从原理到精通,收藏这一篇就够了!

麻省理工学院与瑞士苏黎世联邦理工学院的联合研究团队,提出了计算框架 APOLLO,即通过潜变量优化学习部分重叠潜空间的自编码器,其通过显式建模共享信息和模态特异性信息,为更全面、精准地解析细胞状态及其调控逻辑提供了一条可行的…...

初试FreeRTOS:创建上位机接收数据驱动4个舵机任务,如裸机般无感

解析函数上位机数据协议:协议格式 (LD150舵机)[0x55][0x55][ID][长度][命令][数据...][校验和]2字节 1字节 1字节 1字节 N字节 1字节帧头: 0x55 0x55 ID: 舵机ID (1-4) 或 0xFE (广播) 数据: 每组5字节 ID time_low time_high pos_low pos_high 位置: …...

GraphRAG退场了,BookRAG知识像翻书一样简单

你是否曾面对一本厚厚的说明书、技术手册或学术著作,在寻找某个具体信息时感到无从下手?传统的检索增强生成(RAG)方法在处理这类结构复杂的长文档时,常常力不从心。它们要么将文档视为一盘散沙的文本,丢失了…...

7张图讲透Claude Code架构(非常详细),Harness设计从入门到精通,收藏这一篇就够了!

1. 整体概述 众所周知,Claude Code不仅仅是Coding产品,更是一个通用的终端Agent:能循环思考、调度工具、治理权限、恢复上下文、稳定长会话… 如何研读项目源码呢? 首先,我让AI帮着梳理了下目录架构和模块职责&…...

02_Elasticsearch知识体系之Mapping映射设计与索引建模实战

02_Elasticsearch知识体系之Mapping映射设计与索引建模实战 Elasticsearch知识体系 基础概念层数据存储层【本文】查询语言层搜索能力层数据处理层集群架构层开发集成层AI增强层行业应用层 关键词: Elasticsearch、Mapping、动态映射、显式映射、字段类型、分片、副…...

四开关Buck-Boost双向DC-DC电源系统全套学习资料:STM32F334C8T6控制下...

四开关Buck-Boost双向DC-DC电源整套学习资料 功能:采用STM32F334C8T6芯片,能够根据输入电压和输出电压的大小关系,实现自动切换工作模式,将参数信息进行显示,并且可以实现稳压输出 程序仿真硬件软件说明报告原理图计算…...

COMSOL水力压裂岩石多裂隙损伤耦合模型及含离散裂隙Matlab建模文件

comsol水力压裂岩石多裂隙损伤耦合模型,含离散裂隙matlab建模文件地下三千米的页岩层正在经历一场暴力美学——高压水柱像手术刀般精准切开岩石,形成错综复杂的裂缝网络。这个看似野蛮的过程背后,隐藏着流-固-损伤三场耦合的精密舞蹈。今天我…...

STM32F107单片机驱动Dp83848以太网芯片程序 项目开发用到了Dp83848这一个以...

STM32F107单片机驱动Dp83848以太网芯片程序 项目开发用到了Dp83848这一个以太网芯片,本人发现其配置起来比较麻烦,所以整理了一份STM32F107单片机驱动Dp83848的程序代码例程,方便大家学习相关代码的配置最近在项目里折腾STM32F107和DP83848这…...

基于MATLAB的多种概率分布拟合与KS检验:从GEV到Exponential分布选择与实践

11种概率分布的拟合与ks检验,可用于概率分析,可靠度计算等领域 案例中提供11种概率分布,具体包括:gev、logistic、gaussian、tLocationScale、Rayleigh、Loglogistic、Lognormal、GeneralizedPareto、Weibull、Gamma、Exponential…...

如何高效构建Steam游戏DRM解除自动化解决方案:开源框架技术实现

如何高效构建Steam游戏DRM解除自动化解决方案:开源框架技术实现 【免费下载链接】Steam-auto-crack Steam Game Automatic Cracker 项目地址: https://gitcode.com/gh_mirrors/st/Steam-auto-crack Steam游戏DRM解除自动化解决方案为技术爱好者提供了一套完整…...

3步彻底解决Windows多显示器DPI缩放难题:SetDPI工具完全指南

3步彻底解决Windows多显示器DPI缩放难题:SetDPI工具完全指南 【免费下载链接】SetDPI 项目地址: https://gitcode.com/gh_mirrors/se/SetDPI 还在为Windows系统下多显示器DPI缩放不一致而烦恼吗?主显示器清晰锐利,副显示器却模糊不堪…...

跳点搜索算法(JPS)融合动态窗口法,JPS规划全局路径,动态窗口法执行动态避障

跳点搜索算法(JPS)融合动态窗口法,JPS规划全局路径,动态窗口法执行动态避障最近在搞机器人路径规划,总得在效率和安全之间找平衡。今天聊点实战的——把跳点搜索(JPS)和动态窗口法(D…...

claw-code 源码详细分析:子系统目录地图——几十个顶层包如何用五条轴(会话 / 工具 / 扩展 / 入口 / 桥接)读懂?

范围:src/ 下 顶层包(含 */__init__.py 的目录)与 与会话/runtime 强相关的根模块;与 result/01_start.md 第十三节、「清单—路由—会话」叙事一致。1. 为什么用五条轴 src/ 里同时存在: 大量占位包(读 re…...

S7-200 MCGS 基于PLC的小型水厂恒压供水系统 带解释的梯形图接线图原理图图纸,io分配

S7-200 MCGS 基于PLC的小型水厂恒压供水系统 带解释的梯形图接线图原理图图纸,io分配,组态画面最近在搞一个小型水厂的恒压供水系统项目,用西门子S7-200 PLC搭配MCGS组态软件,效果挺有意思的。这个系统核心就仨字——稳如狗&#…...

全贴合工艺中Cover Lens Mura不良的关键影响因素与优化策略

1. 全贴合工艺中的Mura现象解析 第一次看到全贴合屏幕上出现发黄或发白的斑块时,我还以为是产品运输途中受了撞击。后来在产线蹲守三个月才发现,这些被称为"Mura"的光学缺陷,其实是贴合工艺中的隐形杀手。Mura这个词源自日语"…...

深入解析build.prop:从基础参数到高级定制指南

1. build.prop文件到底是什么? 第一次在Android系统目录里看到build.prop这个文件时,我也是一头雾水。这玩意儿看起来就像个普通的文本文件,但里面密密麻麻的参数却让人望而生畏。后来才发现,它其实是Android系统的"身份证&q…...

别只盯着TCP!拆解大疆源码里MQTT协议的双通道设计:BASIC与DRC到底有啥区别?

大疆源码中的MQTT双通道设计:BASIC与DRC的工程哲学 在分析大疆无人机开源项目的通信架构时,一个有趣的设计选择跃然眼前——MQTT协议同时运行在TCP和WebSocket两种传输层上。这种看似冗余的配置背后,隐藏着对物联网通信场景的深刻理解。本文将…...

一台机器也能玩转StarRocks?手把手教你搭建单机测试环境(附避坑指南)

一台机器玩转StarRocks:单机测试环境搭建实战与避坑指南 当你想快速验证StarRocks的功能特性,或者进行本地开发测试时,单机部署是最便捷的选择。虽然官方并不推荐在生产环境中使用单机模式,但对于个人开发者、学生或测试场景来说&…...

一次删错索引引发的血案:手把手教你复盘线上购物车故障(附完整报告模板)

一次删错索引引发的血案:手把手教你复盘线上购物车故障 那天凌晨3点,我被刺耳的电话铃声惊醒。值班同事急促的声音从听筒传来:"购物车服务完全瘫痪,用户投诉像雪片一样涌来。"当我跌跌撞撞赶到公司时,整个技…...

从零搭建WebRTC SFU服务器:基于Mediasoup的1080P视频会议部署教程

从零搭建WebRTC SFU服务器:基于Mediasoup的1080P视频会议部署教程 视频会议已成为现代远程协作的核心工具,而WebRTC技术让浏览器间的实时音视频通信变得触手可及。但当你需要支持10人以上的高清会议时,单纯的P2P连接就会暴露出带宽和性能瓶颈…...

Claude Code 接入 DeepSeek、GLM、MiniMax 等国产大模型,保姆级教程!

每天免费领 1亿 Token,白嫖DeepSeek、GLM、MiniMax、Kimi等大模型! 这份指南是专门为那些“只想赶紧上手开干”的朋友准备的。 咱们不整那些虚头巴脑的理论,直接帮你搞定这几件事: 怎么把 Claude Code 装好如何确定它已经能跑通…...

拆解Clonezilla镜像:除了partclone,你还需要知道的底层原理与工具链

拆解Clonezilla镜像:从分卷压缩到文件系统的技术全景解析 当我们需要从Clonezilla备份中提取单个文件时,传统方法往往要求完整恢复整个镜像——这种"全有或全无"的方式在存储资源有限的情况下显得尤为笨重。本文将带您深入Clonezilla镜像的底层…...

CSS 语音参考

CSS 语音参考 概述 CSS(层叠样式表)是网页设计中的核心组成部分,它允许开发者控制网页元素的样式,包括颜色、布局、字体等。在网页设计中,有时我们需要为特定的元素添加语音提示,以便于视觉障碍者或需要语音辅助的用户使用。本文将详细探讨CSS中语音参考的实现方法,包…...

AngularJS Http详解

AngularJS Http详解 引言 AngularJS是一个流行的JavaScript框架,用于构建动态和响应式的web应用。在AngularJS中,HTTP请求是数据交互的重要组成部分。本文将详细介绍AngularJS的Http服务,包括其基本用法、高级特性以及如何处理异步请求。 AngularJS Http服务简介 Angula…...