Lombok注解 - 提高Java开发效率

在这里插入图片描述

01 繁琐编码

初入 Java 开发领域时,编写实体类的琐碎经历想必各位都深有感触。

每当创建一个实体类,铺天盖地的 getter、setter、toString 方法接踵而至,手指在键盘上频繁敲击,酸痛不已。

而 Lombok 这一神器的出现,宛如黑暗中的一道曙光,凭借注解技术,在编译阶段自动产出那些令人厌烦的样板代码,极大地减轻了开发人员的负担。

02 基础注解

1. @Getter 与 @Setter

这两个注解堪称懒人福音。

试想一个拥有多个私有字段的 User 类,若手动编写 getter 和 setter 方法,代码量瞬间膨胀。

而使用 @Getter 和 @Setter 后,一切变得简洁明了。

@Getter
@Setter
public  class  User {private  String  name; // 用户名private  int age;     // 用户年龄
}

注解 :

  1. @Getter 为每个私有字段生成对应的 getXxx() 方法。

  2. @Setter 则生成 setXxx() 方法,方便外部修改字段值。

  3. 这使得 User 类的字段操作变得异常便捷。

但实际场景中,有些字段可能无需 setter 方法,例如数据库中的主键 ID 字段,通常不希望被随意修改。

此时,可仅在类上标注 @Getter,对需要 setter 的字段单独使用 @Setter。

2. 构造方法相关注解

• @NoArgsConstructor :如其名,生成无参构造方法。
在需要实例化但不立即赋值的场景下非常实用。

• @AllArgsConstructor :生成包含所有字段的构造方法,方便一次性为所有属性赋值。

@NoArgsConstructor
@AllArgsConstructor
public  class  Product {private  Long   id;         // 产品 IDprivate  String   name;     // 产品名称private  BigDecimal  price; // 产品价格
}

注解 :

  1. @NoArgsConstructor 提供无参构造,方便反序列化等场景。

  2. @AllArgsConstructor 使得创建 Product 对象时可直接传入所有属性值,提高开发效率。

3. 但若某些字段应为必填(如产品名称和价格),而 ID 可由数据库自动生成,@AllArgsConstructor 可能会导致字段赋值不符合业务逻辑。

这时,@RequiredArgsConstructor 便大显身手。

它会为所有 final 字段和带有 @NonNull 注解的字段生成构造参数。

public  class  Order {private  final   Long  id; // 订单 ID,final  表示不可修改private  String   orderNo; // 订单编号@NonNullprivate  Customer  customer; // 客户信息,@NonNull 表示非空private  String   remark; // 备注
}
public  class  ProductService {private  final   ProductMapper  productMapper; // 数据库映射器private  final   Cache  productCache; // 缓存
}

注解 :

  1. @RequiredArgsConstructor 针对 final 字段和 @NonNull 注解字段生成构造方法。

  2. 保证关键字段在对象创建时就被正确初始化。

  3. 避免了非必填字段在构造方法中强制出现,使构造逻辑更符合业务规则。

03 进阶注解:提升开发体验

1. @Data

堪称 Lombok 中的瑞士军刀,它集 @Getter、@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor 于一身。

一个简单的 Employee 类,使用 @Data 后,几乎所有常用方法都已就绪。

@Data
public  class  Employee {private  Long  id;         // 员工 IDprivate  String  name;     // 员工姓名private  Department department; // 所属部门
}

注解 :

  1. 自动生成 Getter 和 Setter 方法,方便字段读写。

  2. 重写 toString() 方法,便于对象信息的查看与调试。

  3. 实现 equals() 和 hashCode() 方法,基于所有字段进行比较和哈希计算。

  4. 提供包含 final 字段的构造方法。

但需注意,@Data 生成的 Setter 方法会让所有字段均可修改,这在某些场景下可能引发数据安全问题。

比如对于一些敏感信息或业务规则明确不可变的字段,我们更倾向于使用只读的注解组合。

2. @Value

与 @Data 相对应,@Value 生成的类是不可变的,所有字段都是 final 的,非常适合表示值对象。

@Value
public  class  Point {int x; // 坐标 x 值int y; // 坐标 y 值
}

注解 :

  1. 自动为字段生成 Getter 方法。

  2. 字段默认为 final ,保证对象创建后其状态不可改变。

  3. 重写 equals() 和 hashCode() 方法,基于字段内容进行比较。

这种不可变性在多线程环境下尤为可贵,能有效避免并发修改带来的问题。

3. 日志注解 @Slf4j

开发过程中,日志记录是追踪程序行为、排查问题的关键手段。

手动创建 Logger 对象既繁琐又容易出错,而 @Slf4j 能自动为类生成 Logger 字段。

import lombok.extern.slf4j.Slf4j;@Slf4j
public  class  OrderService {public  void  createOrder(Order order) {log.info("Creating order: {}", order); // 记录订单创建信息}
}

注解 :

  1. @Slf4j 自动引入 slf4j 日志框架的 Logger 对象。

  2. 通过 log.info() 等方法,可方便地输出不同级别的日志信息。

  3. 提高代码整洁性,使日志记录操作更加直观、简洁。

4. 建造者注解 @Builder

当面对包含众多可选参数的类时,传统的构造方法会变得冗长且难以维护。

@Builder 注解巧妙地运用建造者模式,巧妙地解决了这一难题。

@Builder
publicclassComputer {private  String  cpu;     // 中央处理器private  String  memory;  // 内存private  String  disk;    // 硬盘private  String  gpu;     // 显卡
}// 使用建造者模式创建 Computer 对象
ComputermyPC= Computer.builder().cpu("i7").memory("16GB").disk("512GB SSD").build();

注解 :

  1. @Builder 为每个字段生成一个建造者方法。

  2. 通过链式调用,可清晰地指定每个参数的值。

  3. 对于非必需参数,可以选择性地设置,提高了代码的灵活性和可读性。

这种风格在配置类、复杂对象创建场景中格外受欢迎,能让代码逻辑更加清晰、易于理解和维护。

5. 非空注解 @NonNull

@NonNull 注解犹如程序中的安全卫士,在编译期便能发现潜在的空指针问题。

当标注了 @NonNull 的参数传入 null 时,Lombok 会果断抛出 NullPointerException,避免程序在运行时因空指针异常而崩溃。

public  class  StringUtil {public  void  process(@NonNull String  input) {System.out.println(input.length());}
}

注解 :

  1. @NonNull 用于方法参数时,确保传入的参数不能为 null。

  2. 在编译阶段就能捕获可能的空值风险。

  3. 提高代码的健壮性和可靠性,减少因空指针导致的程序错误。

6. 懒加载技术

对于那些初始化成本高昂的字段,采用懒加载策略可以优化程序性能。

只有在第一次访问该字段时,才进行初始化操作。

public  classHeavyResource {privatefinal  Map<String , Object > cachedData;publicHeavyResource() {cachedData = null; // 初始化为 null}public  Map<String , Object > getCachedData() {if (cachedData == null) {cachedData = initCache();}return  cachedData;}private  Map<String , Object > initCache() {// 模拟初始化耗时操作Map<String , Object > map = newHashMap<>();// 填充数据...return  map;}
}

注解 :

  1. cachedData 字段初始为 null。

  2. 当第一次调用 getCachedData() 方法时,才执行 initCache() 方法进行初始化。

  3. 避免了对象创建时就进行不必要的资源消耗,提升了程序启动和运行的效率。

04 实际项目中的注解搭配策略

在实际的项目开发中,合理搭配使用 Lombok 注解,能够事半功倍。

• 对于实体类:若需要对象可变,可使用 @Data 加上 @Builder;若要求对象不可变,则选择 @Value,确保数据的完整性和安全性。
• 对于服务类:@Slf4j 与 @RequiredArgsConstructor 是黄金组合。前者方便日志记录,后者能够配合 Spring 框架的依赖注入,使服务类的构造和日志操作简洁又高效。

• 对于配置类:@Builder 注解能将复杂的配置参数以清晰、灵活的方式呈现,方便开发者进行配置管理和调整。
• 对于工具类:@UtilityClass 注解可以确保工具类不能被实例化,同时为其中的静态方法提供便捷的访问方式,保证工具类的正确使用和代码的整洁。

Lombok 以其出色的注解功能,极大地减少了 Java 开发中的样板代码,

让开发人员能够将更多的精力投入到核心业务逻辑的实现上。

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

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

相关文章

Linux修改uboot启动延时方法详细攻略,触觉智能RK3568开发板演示

修改uboot延时 首先查找defconfig文件 ./build.sh uboot #通过编译日志查看使用的defconfig文件ls u-boot/configs/*3568* #在SDK根目录下执行该操作 如图标注处就是所使用的u-boot配置文件。 然后修改延时数&#xff1a; vim u-boot/configs/rk3568_defconfig 将CONFIG_BOO…

dockers virbox 安装

sudo apt remove docker docker-engine docker.io containerd runc 更新包索引并安装依赖 sudo apt update sudo apt install ca-certificates curl gnupg 添加Docker官方GPG密钥 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux…

Restormer: Efficient Transformer for High-Resolution Image Restoration 论文阅读

题目 (Title): Restormer&#xff1a;用于高分辨率图像恢复的高效Transformer 摘要 (Abstract): 由于卷积神经网络&#xff08;CNN&#xff09;在从大规模数据中学习可泛化的图像先验方面表现出色&#xff0c;这些模型已被广泛应用于图像恢复及相关任务。最近&#xff0c;另一…

音视频开发协议栈全景解析

音视频开发协议栈全景解析 引言&#xff1a;协议栈的重要性与演进 在当今数字化时代&#xff0c;音视频技术已成为互联网基础设施的核心组成部分。从视频会议、直播到智能安防、元宇宙应用&#xff0c;音视频协议栈的设计直接影响着用户体验质量(QoE)。作为开发者&#xff0c…

Java面试题025:一文深入了解数据库Redis(1)

欢迎大家关注我的JAVA面试题专栏,该专栏会持续更新,从原理角度覆盖Java知识体系的方方面面。 一文吃透JAVA知识体系(面试题)https://bl

Python:调用json.dumps处理datetime对象数据

文章目录 前言一、查询SQL语句中数据转换1、思路2、示例3、常用格式化模式4、注意事项 二、自定义JSONEncoder处理1、思路2、示例3、使用方法 写在结尾 前言 使用Python开发查询PostgreSQL数据库&#xff0c;返回数据中有timestamp类型数据字段。如果使用json.dumps转换成json对…

QT6 源(130)视图模型架构中的字符串列表模型 QStringListModel:成员函数,本类的继承关系图以及源码注释

&#xff08;1&#xff09;字符串列表型的 model &#xff0c;可以交给视图 view 来显示&#xff0c;也可以由组合框 comboBox 读取其中的内容 &#xff1a; &#xff08;2&#xff09;以下开始学习本字符串 model 里的成员函数&#xff0c;本类没有再定义信号与槽函数 &#x…

dockerfile命令及构建+docker-compose安装构建

一&#xff0c;dockerfile常用命令 命令介绍FROM–指定基础镜像LABEL作者信息USER切换运行属主身份WORKDUR切换工作目录ENV用于docker容器设置环境变量RUN用来执行命令行的命令COPY把宿主机文件复制到镜像中去ADD将文件路径复制添加到容器内部路径EXPOSE为容器打开指定要监听的…

数学:逆元,同余

逆元&#xff0c;同余 0.引言1.同余1.1 同余的基本性质1.2 解同余线性方程 2.逆元费马小定理求逆元(m必需为质数&#xff09;扩展欧几里得求逆元&#xff08;使用任意互质的a和m&#xff09; 0.引言 本文讲述什么是逆元&#xff0c;如何求逆元。求逆元的两种常规方法。然后知道…

广州华锐互动:技术与创意双驱动的 VR 先锋​

广州华锐互动能够在众多 VR 公司中崭露头角&#xff0c;离不开其强大的技术实力和源源不断的创意灵感 。在技术研发方面&#xff0c;广州华锐互动组建了一支专业的技术团队&#xff0c;团队成员均具备扎实的技术功底和丰富的行业经验&#xff0c;他们专注于 VR、AR、3D 等核心技…

教育培训教学通用PPT模版

教育培训通用PPT模版&#xff0c;儿童教育PPT模版&#xff0c;公开课件教学PPT模版&#xff0c;读书笔记PPT模版&#xff0c;古风PPT模版&#xff0c;教育教学通用PPT模版 教育培训教学通用PPT模版&#xff1a;https://pan.quark.cn/s/6c2ed020e398

Data Vault 初探(五) —— 定期装载_SQL

说明&#xff1a; 1. 定期装载的周期为每天一次。 2. 每天装载自上次装载后的变化数据 3. 建立源数据库的过渡表用于CDC 4. 建立cdc_time表用于基于时间戳的CDC 5. 因为源库上只有订单销售表有时间属性&#xff0c;所以除了sales_order和sales_order_item拉取变化数据外&#x…

Java虚拟机栈(JVM Stack)详解与工作流程分析

Java虚拟机栈&#xff08;JVM Stack&#xff09;详解与工作流程分析 1. 虚拟机栈核心概念 基本特性 线程私有&#xff1a;每个线程在创建时都会分配一个独立的栈存储内容&#xff1a; 栈帧&#xff08;Stack Frame&#xff09;&#xff1a;每个方法调用对应一个栈帧 生命周期…

Sonarqube:Jenkins触发sonar扫描出现UnsupportedClassVersionError错误处理

文章目录 1、问题现象2、问题根因3、解决思路3.1 解决思路13.2 解决思路23.3 解决思路3 1、问题现象 问题现象&#xff1a;在每次Jenkins触发sonar扫描时&#xff0c;Sonar-scanner扫描器执行都会出现UnsupportedClassVersionError异常&#xff0c;如下&#xff1a; ERROR: …

Spark SQL to_json 函数介绍

目录 前言函数介绍参数说明示例 前言 在Apache Hive中&#xff0c;并没有内置的to_json函数。在Apache Spark SQL中确实有to_json函数,它可以用来将结构化数据&#xff08;如结构化类型或MAP类型&#xff09;转换为JSON字符串。这个功能对于需要将表格数据输出为JSON格式的场景…

《解锁前端潜力:自动化流程搭建秘籍》

当项目逐渐从萌芽走向繁茂&#xff0c;中期阶段对流程优化与效率提升的需求便愈发迫切。搭建一套自动化测试、持续集成与部署的完整流程&#xff0c;已然成为突破瓶颈、保障代码质量与上线效率的关键密钥。这不仅是技术的进阶&#xff0c;更是思维与协作模式的革新。在踏上构建…

计算机体系结构中的片上系统SoC是什么?

计算机体系结构中的片上系统SoC是什么&#xff1f; 片上系统&#xff08;SoC&#xff0c;System on Chip&#xff09; 是一种将计算机或其他电子系统的多个关键组件集成到单一芯片上的集成电路设计。它不仅仅是处理器&#xff08;CPU&#xff09;&#xff0c;而是将处理器、内…

linux虚拟机基础-磁盘扩容详细版本模拟实验

扩容实验参考上一篇博客&#xff1a; https://blog.csdn.net/wenxiaocsdn/article/details/141932877?spm1001.2014.3001.5502 LVM基础知识附录红帽官方文档 配置和管理逻辑卷 | Red Hat Enterprise Linux | 8 | Red Hat Documentation LVM逻辑结构图 LVM 管理命令速查表&…

hbase高可用部署

要实现HBase集群的高可用部署&#xff08;High Availability, HA&#xff09;&#xff0c;核心在于消除单点故障&#xff08;特别是HMaster节点&#xff09;&#xff0c;并确保数据冗余和服务自动恢复。以下是、关键步骤和配置要点&#xff1a; 一、核心配置步骤‌ ‌1.1 启用…

STM32F103ZET6开发板【项目工程创建】+具体实现步骤流程

硬件介绍 芯片为STM32F103ZET6 STM32F103 资源简介 STM32 的优异性 1&#xff0c;超低的价格。8 位机的价格&#xff0c;32 位机的性能&#xff0c;是 STM32 最大的优势。 2&#xff0c;超多的外设。STM32 拥有包括&#xff1a;FMC、TIMER、SPI、IIC、USB、CAN、IIS、SDIO、…