Lombok 实用注解深度解析!

在这里插入图片描述

目录

    • 一、@AllArgsConstructor:全参数构造函数生成器
      • 1. 基本概念
      • 2. 使用示例
      • 3. 高级特性
      • 4. 注意事项
    • 二、@RequiredArgsConstructor:必需参数构造函数生成器
      • 1. 基本概念
      • 2. 使用示例
      • 3. 高级特性
      • 4. 注意事项
    • 三、@SneakyThrows:异常处理"偷懒"神器
      • 1. 基本概念
      • 2. 使用示例
      • 3. 实现原理
      • 4. 注意事项
    • 四、@UtilityClass:工具类终结者
      • 1. 基本概念
      • 2. 使用示例
      • 3. 转换后的代码
      • 4. 注意事项
    • 五、@Cleanup:资源自动清理器
      • 1. 基本概念
      • 2. 使用示例
      • 3. 高级特性
      • 4. 实现原理
      • 5. 注意事项
    • 六、最佳实践与注意事项
      • 1. 合理选择构造函数注解
      • 2. 谨慎使用@SneakyThrows
      • 3. 工具类设计原则
      • 4. 资源清理最佳实践
      • 5. Lombok配置
    • 七、总结

在Java开发中,Lombok作为一款强大的代码生成工具,通过简洁的注解极大地减少了样板代码的编写。本文将深入解析Lombok中五个非常实用的注解:@AllArgsConstructor@RequiredArgsConstructor@SneakyThrows@UtilityClass@Cleanup,通过实例代码和详细说明,帮助开发者掌握这些注解的使用技巧和最佳实践。

一、@AllArgsConstructor:全参数构造函数生成器

1. 基本概念

@AllArgsConstructor注解会为类生成一个包含所有字段(非静态、非transient)的构造函数。如果字段被标记为final,它们也会被包含在构造函数中,因为final字段必须在构造时初始化。

2. 使用示例

import lombok.AllArgsConstructor;
import lombok.ToString;@AllArgsConstructor
@ToString
public class User {private Long id;private String name;private Integer age;
}// 使用示例
public class Main {public static void main(String[] args) {User user = new User(1L, "Alice", 25);System.out.println(user); // 输出: User(id=1, name=Alice, age=25)}
}

3. 高级特性

  • 静态工厂方法:可以生成静态工厂方法替代构造函数

    @AllArgsConstructor(staticName = "of")
    public class Product {private String name;private double price;
    }// 使用静态工厂方法
    Product p = Product.of("Laptop", 999.99);
    
  • 访问控制:可以指定构造函数的访问级别

    @AllArgsConstructor(access = AccessLevel.PROTECTED)
    

4. 注意事项

  • 如果类中已存在构造函数,Lombok不会生成新的构造函数
  • 对于final字段,如果未在声明时初始化,必须包含在构造函数中
  • 生成的构造函数参数顺序与字段声明顺序一致

二、@RequiredArgsConstructor:必需参数构造函数生成器

1. 基本概念

@RequiredArgsConstructor会生成一个包含所有必需字段的构造函数,包括:

  • 所有final字段(且未初始化)
  • 所有标记为@NonNull的字段(且未初始化)

2. 使用示例

import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.ToString;@RequiredArgsConstructor
@ToString
public class Product {private final Long id;@NonNullprivate String name;private Double price;
}// 使用示例
public class Main {public static void main(String[] args) {Product product = new Product(1L, "Smartphone");System.out.println(product); // 输出: Product(id=1, name=Smartphone, price=null)}
}

3. 高级特性

  • 静态工厂方法:同样支持staticName参数
  • 自定义字段:可以使用@RequiredArgsConstructor(onConstructor = @__(@Autowired))与Spring等框架集成

4. 注意事项

  • 如果final字段在声明时已初始化,则不会包含在构造函数中
  • @NonNull字段会自动生成非空检查
  • 适用于依赖注入场景,特别是Spring框架的构造函数注入

三、@SneakyThrows:异常处理"偷懒"神器

1. 基本概念

@SneakyThrows注解允许在方法中抛出受检异常(checked exception)而无需在方法签名中声明throws。Lombok会在编译时将受检异常包装为运行时异常。

2. 使用示例

import lombok.SneakyThrows;
import java.io.FileInputStream;
import java.io.IOException;public class FileUtils {@SneakyThrowspublic static String readFile(String filePath) {FileInputStream fis = new FileInputStream(filePath);// ... 读取文件操作return "File content";}public static void main(String[] args) {// 调用时无需处理IOExceptionString content = readFile("test.txt");}
}

3. 实现原理

Lombok在编译时会生成类似这样的代码:

public static String readFile(String filePath) {try {FileInputStream fis = new FileInputStream(filePath);// ...} catch (Throwable t) {throw Lombok.sneakyThrow(t);}
}

4. 注意事项

  • 可能掩盖异常处理,降低代码可读性
  • 在可能的情况下,优先使用显式异常处理
  • 适用于确定异常不会发生或调用方无法处理的情况
  • 在Java 8+中,可以考虑使用UncheckedIOException等替代方案

四、@UtilityClass:工具类终结者

1. 基本概念

@UtilityClass将类标记为工具类,自动完成以下操作:

  • 将类标记为final
  • 添加私有构造函数(防止实例化)
  • 将所有方法、字段和内部类转换为static

2. 使用示例

import lombok.experimental.UtilityClass;@UtilityClass
public class MathUtils {public int add(int a, int b) {return a + b;}public int subtract(int a, int b) {return a - b;}private final double PI = 3.14159;
}// 使用示例
public class Main {public static void main(String[] args) {int sum = MathUtils.add(5, 3);System.out.println("Sum: " + sum); // 输出: Sum: 8System.out.println("PI: " + MathUtils.PI); // 输出: PI: 3.14159}
}

3. 转换后的代码

Lombok实际生成的代码类似于:

public final class MathUtils {private MathUtils() {throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");}public static int add(int a, int b) {return a + b;}public static int subtract(int a, int b) {return a - b;}private static final double PI = 3.14159;
}

4. 注意事项

  • 工具类不能有实例成员(方法、字段或内部类)
  • 不能被继承(因为是final类)
  • 不能被实例化(构造函数是私有的)
  • 适用于纯静态方法的工具类场景

五、@Cleanup:资源自动清理器

1. 基本概念

@Cleanup注解用于自动调用资源的close()方法(或其他指定的清理方法)来释放资源,类似于Java 7的try-with-resources语法。

2. 使用示例

import lombok.Cleanup;
import java.io.*;public class FileCopy {public static void copyFile(String source, String target) throws IOException {@Cleanup FileInputStream in = new FileInputStream(source);@Cleanup FileOutputStream out = new FileOutputStream(target);byte[] buffer = new byte[1024];int length;while ((length = in.read(buffer)) > 0) {out.write(buffer, 0, length);}}
}

3. 高级特性

  • 自定义清理方法:可以指定非close()的清理方法

    @Cleanup("dispose") 
    JFrame frame = new JFrame();
    
  • 清理顺序:按照声明的相反顺序执行清理

4. 实现原理

Lombok生成的代码类似于:

FileInputStream in = new FileInputStream(source);
try {FileOutputStream out = new FileOutputStream(target);try {byte[] buffer = new byte[1024];int length;while ((length = in.read(buffer)) > 0) {out.write(buffer, 0, length);}} finally {out.close();}
} finally {in.close();
}

5. 注意事项

  • 只能用于局部变量
  • 如果资源为null,不会尝试清理
  • 清理方法抛出的异常会被抑制,原始异常会被保留
  • 在Java 7+中,优先考虑使用try-with-resources语法

六、最佳实践与注意事项

1. 合理选择构造函数注解

  • 使用@RequiredArgsConstructor替代@AllArgsConstructor,避免不必要的参数
  • 在Spring等框架中,@RequiredArgsConstructor配合@NonNull实现依赖注入

2. 谨慎使用@SneakyThrows

  • 仅在确定异常不会发生或调用方无法处理时使用
  • 考虑使用Optional或其他方式处理可能失败的操作

3. 工具类设计原则

  • 使用@UtilityClass确保工具类不被实例化
  • 避免在工具类中维护状态(所有字段应为static final

4. 资源清理最佳实践

  • 优先使用Java 7+的try-with-resources语法
  • 对于不支持AutoCloseable的资源,使用@Cleanup指定清理方法
  • 确保清理方法不会抛出异常,或能够安全处理异常

5. Lombok配置

  • lombok.config文件中配置全局选项:
    # 禁用@Cleanup的警告
    lombok.cleanup.warn = false# 设置@UtilityClass的构造函数消息
    lombok.utilityClass.flagUsage = WARNING
    

七、总结

Lombok通过简洁的注解极大地简化了Java开发中的样板代码:

  1. @AllArgsConstructor:生成全参数构造函数,适用于对象创建
  2. @RequiredArgsConstructor:生成必需参数构造函数,特别适合依赖注入
  3. @SneakyThrows:简化异常处理,但需谨慎使用
  4. @UtilityClass:创建纯静态工具类,防止实例化
  5. @Cleanup:自动资源管理,防止资源泄漏

合理使用这些注解可以显著提高代码简洁性和开发效率,但也要注意保持代码的可读性和可维护性。在实际项目中,建议结合团队编码规范,选择最适合的Lombok注解组合,并配置适当的编译器检查,确保代码质量。

提示:在IDE中使用Lombok时,请确保安装了Lombok插件,并启用了注解处理功能(在IntelliJ IDEA中:Settings > Build > Annotation Processors > Enable annotation processing)。

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

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

相关文章

Go+Gdal 完成高性能GIS数据空间分析

概要 环境准备 技术流程 一、在golang中如何调用gdal 二、读取数据 三、执行空间分析 四、性能提升 小结 概要 Gdal库可以说是所有gis软件的基础,基本上现在所有的工业gis软件都是基于gdal开发的,其主要包括了栅格处理、矢量处理、坐标系处理所涉及的各类…

【python】python进阶——Lambda 函数

目录 引言 一、简介 1.1 基本语法 1.2 优势 1.3 局限性 二、基本用法 2.1 无参数lambda 函数 2.2 多参数 lambda 函数 三、常见使用场景 3.1 与高阶函数配合使用 3.2 作为排序键 3.3 在 GUI 编程中作为回调函数 3.4 在 Pandas 中的应用 四、高级技巧 4.1 条件表…

基于单片机电动车充电桩/充电车棚环境监测设计

传送门 👉👉👉👉其他作品题目速选一览表 👉👉👉👉其他作品题目功能速览 概述 随着电动车普及,充电桩的环境安全监测成为重要课题。基于单片机的电动车充电桩环境检…

Linux初始——编译器gcc

编译器gcc编译器编译器自举动静态库动静态库的差异gcc编译器 众所周知,代码运行的前提是经过四个步骤的 预处理,其进行宏替换,去注释,条件编译,头文件展开的工作,在gcc的选项中对应gcc -E,其就…

Three.js + AI预测:在数字孪生中实现数据可视化智能决策

某智慧工厂的数字孪生系统曾陷入尴尬:3D 模型里的生产线数据实时跳动,却没人能预判 “2 小时后哪台机器会停机”。这就像有了高清监控,却不会分析监控画面 ——Three.js 做出的可视化是 “眼睛”,AI 预测才是 “大脑”。不少团队用…

刀客doc:亚马逊持续猛攻程序化广告

文/刀客doc(头条深一度精选作者)一7月的尾声和8月的开端,广告市场见证了两场截然不同的场面。7月31日,亚马逊公布了截至6月30日的2025年第二季度财报。广告业务表现尤为亮眼:单季收入达到157亿美元,同比增长约22%,成为…

政府网站IPv6检测怎么做?检测指标有哪些?

随着信息技术的飞速发展,IPv6作为下一代互联网的核心协议,已成为全球互联网发展的必然趋势。我国政府高度重视IPv6的规模部署和应用推广,明确要求各级政府网站必须完成IPv6改造,以提升网络基础设施的现代化水平,增强网…

有N个控制点的三次B样条曲线转化为多段三阶Bezier曲线的方法

将具有N 个控制点的三次B样条曲线转换为多段三阶Bezier曲线,是计算机图形学和CAD系统中常见的操作。这种转换基于B样条曲线的局部性质以及其与Bezier曲线之间的关系。基本原理三次B样条曲线由一组控制点 P₀, P₁, ..., Pₙ₋₁ 和一个节点向量 U {u₀, u₁, ..., …

chrome好用的浏览器插件

https://ad.infread.com/?utm_sourcebaidu_sem&utm_mediumweb_pc&utm_campaignkeywords_website_translate&bd_vid2831968530895394443 目前我自己觉得比较用的谷歌浏览器翻译插件->沉浸式翻译 个人觉得无论时速度还是准确度都是比较好的

k8s---prometheus 监控

目录 环境准备 下载 kube-prometheus 软件包 下载prometheus 镜像 master节点 master节点导入prometheus软件包 解压 node节点 node节点导入镜像 解压 从tar包中加载镜像 部署 prometheus 修改映射端口 提交 查看pod pod和svc正常启动 deployment daemonset se…

华大时空组学空转图像处理

华大时空组学空转图像处理 library(png) library(tiff) st <- readRDS(01.Stereo-seq/output_all/Demo_Mouse_Kidney/outs/feature_expression/seurat_out.rds) dim(stassays$Spatialcounts) stassays$Spatialcounts[1:4,1:4] coord.df <- data.frame(imagerow st$x, im…

如何在SptingBoot项目中引入swagger生成API文档

目录 背景介绍&#xff0c;swagger的必要性 swagger的引入&#xff1a; 1.首先我们需要在 pom.xml文件中导入jar包 2.给swagger创建一个配置类&#xff1a; 3.为实体类添加注解 4.为controller添加注解 背景介绍&#xff0c;swagger的必要性 自从在2005年前端工程师诞生之…

GD32入门到实战21--输入捕获

我们新建capture_drv.c#include <stdint.h> #include <stdio.h> #include "gd32f30x.h" #include "delay.h"static void GpioInit(void) {rcu_periph_clock_enable(RCU_GPIOA);gpio_init(GPIOA,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_10MHZ,GPIO…

MyBatis 与 MyBatis-Plus 的对比与选择

&#x1f50d; MyBatis 与 MyBatis-Plus 的对比与选择 文章目录&#x1f50d; MyBatis 与 MyBatis-Plus 的对比与选择&#x1f9e0; 一、MyBatis 核心回顾&#x1f4a1; 核心思想与架构定位⚡ 基础使用示例⚠️ MyBatis 的痛点⚡ 二、MyBatis-Plus 功能特性解析&#x1f4a1; M…

大数据-湖仓一体

数据仓库 这是一个传统的概念了&#xff0c;趋向于结构化数据&#xff0c;简单来说就是进过数据治理后的标准数据更易于数据分析使用&#xff0c;代价就是存储比较昂贵了 数据湖 近些年来新出的一种概念&#xff0c;就是存储了结构化&#xff0c;非结构化&#xff0c;半结构…

Java视觉跟踪入门:使用OpenCV实现实时对象追踪

视觉跟踪是计算机视觉领域的一个重要分支&#xff0c;它允许我们在视频序列中持续定位移动对象。本文将介绍如何使用Java和OpenCV库来实现一个简单的视觉跟踪系统。什么是视觉跟踪&#xff1f;视觉跟踪是指通过分析视频帧来自动追踪一个或多个移动对象的过程。这项技术广泛应用…

【题解 | 两种做法】洛谷 P4208 [JSOI2008] 最小生成树计数 [矩阵树/枚举]

特别难调&#xff0c;洛谷题解区很多人代码可读性不强&#xff0c;做的我怀疑人生。 &#xff08;虽然我的码风也一般就是了&#xff09; 前置知识&#xff1a; Kruskal 求最小生成树。 题面&#xff1a; 洛谷 P4208 两种做法&#xff0c;一种矩阵树一种枚举。 &#xff08…

光谱相机多层镀膜技术如何提高透过率

光谱相机多层镀膜技术通过精密的光学设计与材料组合实现透过率提升&#xff0c;其核心原理与技术特性如下&#xff1a;一、多层镀膜的光学优化机制‌复合相位调控‌ 通过交替沉积高折射率&#xff08;如TiO₂, n2.3&#xff09;与低折射率材料&#xff08;如SiO₂, n1.46&#…

ubantu安装配置hive

在Ubuntu系统上安装Hive通常涉及几个步骤&#xff0c;包括安装Java&#xff08;因为Hive依赖于Java&#xff09;&#xff0c;安装Hadoop&#xff0c;然后安装Hive本身。以下是一个基本的步骤指南&#xff1a; 安装Java 首先&#xff0c;确保你的系统上安装了Java。你可以通过运…

大模型RAG项目实战:文本向量模型>Embedding模型、Reranker模型以及ColBERT模型

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《GPT多模态大模型与AI Agent智能体》&#xff08;跟我一起学人工智能&#xff09;【陈敬雷编著】【清华大学出版社】 清华《GPT多模态大模型与AI Agent智能体》书籍配套视频课程【陈敬雷…