Lombok常用注解

Lombok常用注解

Lombok是一个Java库,通过注解的方式帮助开发者减少样板代码的编写,提高开发效率。本文将Lombok常用注解分类整理,并提供详细说明和使用示例。

目录

  • 构造器相关注解
  • 字段相关注解
  • 方法相关注解
  • 代码简化注解
  • 异常处理注解
  • 日志相关注解
  • 实用工具注解
  • 高级用法注解
  • 配置与扩展

构造器相关注解

@NoArgsConstructor

作用:生成一个无参构造器。

示例

    @NoArgsConstructorpublic class User {private Long id;private String name;}

@AllArgsConstructor

作用:生成一个包含所有字段的构造器。

示例

    @AllArgsConstructorpublic class User {private Long id;private String name;}

@RequiredArgsConstructor

作用:为所有带有final修饰或被@NonNull注解的字段生成构造器。

示例

    @RequiredArgsConstructorpublic class User {private final Long id;@NonNullprivate String name;private Integer age; // 不会包含在生成的构造器中}

字段相关注解

@Getter

作用:为类的所有字段生成getter方法,也可以单独应用于某个字段。

示例

    @Getterpublic class User {private Long id;private String name;}// 或者单独应用于字段public class User {@Getterprivate Long id;private String name;}

@Setter

作用:为类的所有非final字段生成setter方法,也可以单独应用于某个字段。

示例

    @Setterpublic class User {private Long id;private String name;}// 或者单独应用于字段public class User {@Setterprivate Long id;private String name;}

@NonNull

作用:在生成的方法中添加非空检查,如果参数为null,则抛出NullPointerException。

示例

    public class User {@NonNullprivate String name;public void setName(@NonNull String name) {this.name = name;}}

@ToString.Exclude

作用:排除特定字段不包含在生成的toString方法中。

示例

    @ToStringpublic class User {private Long id;private String name;@ToString.Excludeprivate String password; // 不会包含在toString方法中}

方法相关注解

@ToString

作用:生成toString方法,可以通过参数控制包含哪些字段。

示例

    @ToString(exclude = "password")public class User {private Long id;private String name;private String password;}// 或者只包含指定字段@ToString(of = {"id", "name"})public class User {private Long id;private String name;private String password;}

@EqualsAndHashCode

作用:生成equals和hashCode方法。

示例

    @EqualsAndHashCodepublic class User {private Long id;private String name;}// 可以指定使用哪些字段@EqualsAndHashCode(of = {"id"})public class User {private Long id;private String name;}

代码简化注解

@Data

作用:组合注解,相当于同时使用了@Getter、@Setter、@ToString、@EqualsAndHashCode和@RequiredArgsConstructor。

示例

    @Datapublic class User {private Long id;private String name;}

@Value

作用:创建不可变类,所有字段都被标记为private final,并生成getter方法(没有setter)。

示例

    @Valuepublic class ImmutableUser {Long id;String name;}

@Builder

作用:实现建造者模式,为类提供一个流式的构建器API。

示例

    @Builderpublic class User {private Long id;private String name;private Integer age;}// 使用方式User user = User.builder().id(1L).name("张三").age(25).build();

@Accessors

作用:自定义访问器(getter和setter)的行为。

示例

    @Data@Accessors(chain = true) // 启用链式调用public class User {private Long id;private String name;}// 使用方式User user = new User().setId(1L).setName("张三");

异常处理注解

@SneakyThrows

作用:允许在不声明throws的情况下抛出受检异常。

示例

    public class FileReader {@SneakyThrowspublic String readFile(String path) {return Files.readString(Path.of(path)); // 无需显式处理IOException}}

日志相关注解

@Slf4j

作用:自动为类添加SLF4J日志对象。

示例

    @Slf4jpublic class UserService {public void saveUser(User user) {log.info("保存用户: {}", user);// 业务逻辑}}

@Log

作用:自动为类添加java.util.logging.Logger对象。

示例

    @Logpublic class UserService {public void saveUser(User user) {log.info("保存用户: " + user);// 业务逻辑}}

@Log4j / @Log4j2

作用:自动为类添加Log4j/Log4j2日志对象。

示例

  @Log4j2public class UserService {public void saveUser(User user) {log.info("保存用户: {}", user);// 业务逻辑}}

实用工具注解

@Cleanup

作用:自动管理资源,确保在作用域结束时调用close()方法。

示例

    public void readFile(String path) {@Cleanup InputStream in = new FileInputStream(path);// 使用in读取文件// 方法结束时会自动调用in.close()}

@Synchronized

作用:方法同步的更安全的变体,使用私有锁对象而不是this。

示例

    public class Counter {private int count = 0;@Synchronizedpublic void increment() {count++;}}

@With

作用:为不可变对象生成"withX"方法,返回字段值被修改的对象副本。

示例

    @Value@Withpublic class ImmutableUser {Long id;String name;}// 使用方式ImmutableUser user = new ImmutableUser(1L, "张三");ImmutableUser newUser = user.withName("李四"); // 创建一个新对象,只有name被修改

@Singular

作用:与@Builder一起使用,为集合类型的字段提供单数形式的添加方法。

示例

    @Builderpublic class User {private Long id;private String name;@Singularprivate List<String> roles;}// 使用方式User user = User.builder().id(1L).name("张三").role("ADMIN")  // 单数形式添加.role("USER")   // 可以多次调用.build();

高级用法注解

@Delegate

作用:实现委托模式,将方法调用委托给指定字段。

示例

    public class UserManager {@Delegateprivate final UserRepository repository = new UserRepositoryImpl();// 无需实现UserRepository的方法,自动委托给repository字段}

@FieldDefaults

作用:批量设置字段的访问级别和修饰符。

示例

    @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)public class User {Long id;        // 等同于 private final Long id;String name;    // 等同于 private final String name;@FieldDefaults(makeFinal = false)Integer age;    // 等同于 private Integer age;}

@Wither

作用:@With的旧版本,功能相同,为不可变对象生成"withX"方法。

示例

    @Value@Witherpublic class ImmutableUser {Long id;String name;}

@UtilityClass

作用:创建工具类,将构造器设为私有,并将类标记为final。

示例

    @UtilityClasspublic class StringUtils {public String capitalize(String str) {if (str == null || str.isEmpty()) {return str;}return Character.toUpperCase(str.charAt(0)) + str.substring(1);}// 无需手动添加private构造器和final修饰符}

@Helper

作用:将内部类中的静态方法"提升"到外部类,使其可以直接通过外部类调用。

示例

    public class StringUtils {@Helperstatic class Helpers {static String capitalize(String str) {if (str == null || str.isEmpty()) {return str;}return Character.toUpperCase(str.charAt(0)) + str.substring(1);}}// 可以直接通过StringUtils.capitalize()调用}

@ExtensionMethod

作用:为已有类添加扩展方法,类似于C#的扩展方法。

示例

    @ExtensionMethod({StringExtensions.class})public class StringProcessor {public void process(String input) {// 直接在String对象上调用扩展方法String result = input.capitalize();}}class StringExtensions {public static String capitalize(String str) {if (str == null || str.isEmpty()) {return str;}return Character.toUpperCase(str.charAt(0)) + str.substring(1);}}

@SuperBuilder

作用:增强版的@Builder,支持继承关系中的构建器模式。

示例

    @SuperBuilderpublic class Person {private String name;private int age;}@SuperBuilderpublic class Employee extends Person {private String company;private double salary;}// 使用方式Employee employee = Employee.builder().name("张三")       // Person类的属性.age(30)           // Person类的属性.company("ABC公司") // Employee类的属性.salary(10000.0)   // Employee类的属性.build();

@Jacksonized

作用:与@Builder或@SuperBuilder一起使用,使生成的构建器与Jackson序列化/反序列化兼容。

示例

 @Jacksonized@Builderpublic class User {private Long id;private String name;private int age;}// 可以直接通过Jackson反序列化为User对象

@FieldNameConstants

作用:为类的所有字段生成常量名称,便于反射操作和动态查询。

示例

@FieldNameConstantspublic class User {private String name;@FieldDefaults(makeFinal = true)private Long id;}// 生成的常量可以这样使用String idFieldName = User.Fields.id;    // "id"String nameFieldName = User.Fields.name; // "name"

配置与扩展

@Accessors

作用:提供更多自定义选项来控制生成的访问器方法。

参数说明

  • chain:启用链式调用,setter方法返回this
  • fluent:生成不带get/set前缀的访问器
  • prefix:指定要去除的字段前缀

示例

    @Data@Accessors(fluent = true, chain = true)public class User {private Long id;private String name;}// 使用方式User user = new User().id(1L)      // 而不是setId.name("张三"); // 而不是setNameLong userId = user.id(); // 而不是getId

@NonFinal

作用:与@Value一起使用,允许某些字段不是final的。

示例

    @Valuepublic class ImmutableUser {Long id;String name;@NonFinalint loginCount; // 不是final,可以修改}

@PackagePrivate

作用:将字段或方法的访问级别设置为包私有。

示例

    public class User {@PackagePrivateString name; // 包私有访问级别@PackagePrivatevoid updateName(String newName) {this.name = newName;}}

lombok.config 配置文件

作用:在项目级别自定义Lombok的行为。

常用配置

    # 停用特定注解lombok.data.flagUsage=errorlombok.value.flagUsage=error# 自定义toString方法的格式lombok.toString.includeFieldNames=falselombok.toString.doNotUseGetters=true# 自定义equalsAndHashCode方法lombok.equalsAndHashCode.callSuper=call# 自定义访问器lombok.accessors.chain=truelombok.accessors.fluent=true# 自定义日志注解lombok.log.fieldName=LOGGERlombok.log.fieldIsStatic=true

@Builder.Default

作用:指定Builder模式中字段的默认值。

示例

    @Builderpublic class User {private Long id;private String name;@Builder.Defaultprivate boolean active = true;@Builder.Defaultprivate List<String> roles = new ArrayList<>(Arrays.asList("USER"));}// 使用方式User user = User.builder().id(1L).name("张三")// 不设置active和roles,将使用默认值.build();

@Tolerate

作用:为自动生成的方法提供替代实现。

示例

    @Datapublic class User {private String name;@Toleratepublic void setName(String name) {// 自定义实现,覆盖Lombok生成的setName方法if (name == null || name.trim().isEmpty()) {throw new IllegalArgumentException("名称不能为空");}this.name = name;}}

@Delegate.Exclude

作用:排除某些方法不被@Delegate委托。

示例

public interface UserRepository {User findById(Long id);List<User> findAll();void save(User user);void delete(User user);}public class UserManager {@Delegate(excludes = DangerousOperations.class)private final UserRepository repository = new UserRepositoryImpl();public interface DangerousOperations {void delete(User user); // 这个方法不会被委托}// 需要自定义实现delete方法public void delete(User user) {// 添加额外的安全检查if (hasPermission()) {repository.delete(user);} else {throw new SecurityException("没有权限删除用户");}}private boolean hasPermission() {// 权限检查逻辑return true;}}

最佳实践与注意事项

组合使用注解

Lombok注解可以组合使用,但需要注意避免冗余和冲突:

    // 推荐的组合@Value@Builderpublic class ImmutableUser {Long id;String name;}// 不推荐的组合(冗余)@Getter@Setter@ToString@EqualsAndHashCode@NoArgsConstructor // 这些注解可以用@Data替代public class User {private Long id;private String name;}

与其他框架的集成

Lombok与其他框架集成时的注意事项:

  1. 与JPA/Hibernate集成
@Entity
@Data
@NoArgsConstructor // JPA需要无参构造器
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@ToString.Exclude // 避免循环引用导致的StackOverflowError@ManyToManyprivate List<Role> roles;
}
  1. 与Jackson集成
    @Data@Builder@NoArgsConstructor // Jackson需要无参构造器@AllArgsConstructor // 配合@Builder使用public class User {private Long id;private String name;@JsonIgnore // Jackson注解与Lombok兼容private String password;}
  1. 与Spring框架集成
    @Service@RequiredArgsConstructor // 自动注入final字段@Slf4jpublic class UserService {private final UserRepository userRepository;public User findById(Long id) {log.info("查找用户: {}", id);return userRepository.findById(id).orElseThrow(() -> new UserNotFoundException(id));}}

调试与反编译

当遇到Lombok相关问题时,可以通过反编译查看生成的代码:

  1. 在IDE中使用反编译功能

  2. 使用javap -c命令

  3. 使用delombok工具:

    java -jar lombok.jar delombok src -d delombok-src

其他

  • Springboot常用注解

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

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

相关文章

【正点原子K210连载】第七十六章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第七十六章 音频FFT实验 本章将介绍CanMV下FFT的应用&#xff0c;通过将时域采集到的音频数据通过FFT为频域。通过本章的学习&#xff0c;读者将学习到CanMV下控制FFT加速器进行FFT的使用。 本章分为如下几个小节&#xff1a; 32.1 maix.FFT模块介绍 32.2 硬件设计 32.3 程序设…

嵌入式开发之STM32学习笔记day08

从“门铃”到“中断”&#xff1a;手把手玩转STM32的外部中断控制器&#xff08;EXTI&#xff09; 引言&#xff1a;为什么我们需要“中断”&#xff1f; &#xff08;类比生活场景&#xff1a;用“快递按门铃”解释中断的意义&#xff09; 想象一下&#xff1a;当你在…

JVM的一些知识

JVM简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java 虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。常见的虚拟机&#xff1a;JVM、VMwave、Virtual Box。 JVM 和其他两个虚拟机的区别&#xff1a; VMw…

Mac:JMeter 下载+安装+环境配置(图文详细讲解)

&#x1f4cc; 下载JMeter 下载地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi &#x1f4cc; 无需安装 Apache官网下载 JMeter 压缩包&#xff0c;无需安装&#xff0c;下载解压后放到自己指定目录下即可。 按我自己的习惯&#xff0c;我会在用户 jane 目…

【简单有效!】Gradio利用html插件实现video视频流循环播放

文章目录 前言 & 思路静态资源挂载完整代码结果示例 前言 & 思路 需要利用gradio在前端搭建一个页面&#xff0c;循环播放视频。思路是直接调用gr.HTML插件实现&#xff0c;简单有效&#xff01;&#xff01;&#xff01; 静态资源挂载 app.mount("/static&quo…

⭐算法OJ⭐克隆图【BFS】(C++实现)Clone Graph

前情提要&#xff1a;图论入门【数据结构基础】&#xff1a;什么是图&#xff1f;如何表示图&#xff1f; 133. Clone Graph Given a reference of a node in a connected undirected graph. Return a deep copy (clone) of the graph. Each node in the graph contains a va…

SpringSecurity——基于角色权限控制和资源权限控制

目录 基于角色权限控制 1.1 自定义 UserDetailsService 1.2 加载用户角色 1.3. 给角色配置能访问的资源&#xff08;使用切面拦截&#xff0c;使用注解&#xff09; 总结 资源权限控制 2.2. 需要有一个用户&#xff1b;&#xff08;从数据库查询用户&#xff09; 2.2 基…

【MySQL】表的约束

目录 零、前言一、空属性二、默认值三、列描述四、zerofill五、主键六、自增长七、唯一键八、外键结尾 零、前言 表中一定要有各种约束&#xff0c;通过约束来让用户未来插入的数据是符合要求的。约束的本质就是通过计算反过来要求用户插入正确的数据。所以站在MySQL的角度上来…

SQLMesh系列教程:SQLMesh虚拟数据环境

各种工具都已将软件工程实践引入到数据工程中&#xff0c;但仍有差距存在&#xff0c;尤其是在测试和工作流等领域。SQLMesh 的目标是在这些领域开辟新的天地&#xff0c;解决像 dbt 这样的竞争产品尚未提供强大解决方案的难题。在这篇文章中&#xff0c;我将对 SQLMesh 进行简…

基于Babylon.js的Shader入门之五:让Shader支持法线贴图

如果一个比较平坦的物体表面要添加更多的凹凸细节&#xff0c;但是我们又不想通过建模实现&#xff0c;这时候法线贴图就派上用场了。法线贴图是通过与灯光的交互来让一个平坦表面造成凹凸效果假象的&#xff0c;在基于Babylon.js的Shader入门之四&#xff1a;让Shader支持基础…

活码在实际操作中的具体场景有哪些?怎么应用?

当传统二维码因“内容固定、无法追踪、流量拥堵”等问题逐渐失效时&#xff0c;活码正在成为企业破解运营痛点的关键工具。 无论是需要实时更新内容的线下物料&#xff0c;还是面临用户分流压力的线上客服&#xff0c;动态二维码都能通过“一码多用、灵活配置”的特性&#xf…

极空间NAS部署gitea教程

极空间NAS部署gitea步骤教程 背景1. 准备镜像1.1 极空间官方1.2 Win系统docker再上传1.3 镜像转录 2. MySql配置2.1 容器配置2.2 命令行配置 3. gitea配置3.1 容器配置3.2 打开网页3.3 网页配置安装 参考资料 背景 极空间Nas和别的Nas不同的地方就在于&#xff0c;他不是那种标…

Wireshark:在 显示过滤器中“加入条件”过滤后,出现其他类型的数据包,为什么?

一、 在Wireshark中使用“tcp协议”过滤后&#xff0c;仍出现TLSv1.2协议的数据包&#xff0c;原因如下&#xff1a; 1. ‌协议层次关系‌ ‌TCP是传输层协议‌&#xff0c;而‌TLS属于应用层协议‌&#xff0c;后者直接运行于TCP之上‌28。因此&#xff0c;所有TLS流量&…

【医学影像 AI】大型语言模型生成 ROP 患者信息材料的能力

【医学影像 AI】大型语言模型生成 ROP 患者信息材料的能力 0. 论文简介0.1 基本信息0.2 摘要 1. 引言2. 材料与方法2.1 大语言模型的使用2.2 可读性标准2.3 统计分析 3. 结果3.1 Bezirci-Yılmaz可读性评分3.2 Ateşman可读性评分3.3 全面性评分3.4 准确性评分 4. 讨论4.1 可读…

设计模式(行为型)-策略模式

目录 定义 类图 角色 角色详解 Strategy&#xff08;抽象策略类&#xff09;​ Context&#xff08;环境类 / 上下文类&#xff09;​ ConcreteStrategy&#xff08;具体策略类&#xff09;​ 优缺点 优点​ 缺点​ 使用场景 类行为差异场景​ 动态算法选…

服装零售行业数字化时代的业务与IT转型规划P111(111页PPT)(文末有下载方式)

服装零售行业数字化时代的业务与IT转型规划P111 详细资料请看本解读文章的最后内容。 随着数字化技术的迅猛发展&#xff0c;服装零售行业正经历着前所未有的变革。本文将对《服装零售行业数字化时代的业务与IT转型规划P111》进行详细解读&#xff0c;探讨未来几年内该行业的…

【大语言模型_6】mindie启动模型错误整理

一、启动报 [hccl_runner.cpp:141] AllGatherHcclRunner:0 HcclCommInitRootInfo fa il, error:2, rank:0, rankSize:2 背景&#xff1a;运行DeepSeek-R1-Distill-Qwen-14B模型&#xff0c;在2张300 P卡可以运行&#xff0c;单独一张启动报以上错误。 问题分析&…

STM32F429单片机FMC接口驱动TFT LCD和SDRAM

1、FMC接口介绍 FMC 接口&#xff08;即可变存储控制器&#xff09;是一种用于管理外部存储器的外设接口&#xff0c;支持多种类型的存储器&#xff0c;主要分为三大类&#xff1a;NOR/SRAM/PSRAM设备&#xff08;TFTLCD相当于SRAM&#xff09;、NOR FLASH/NAND FLASH/PC卡设备…

ollama不安装到c盘,安装到其他盘

ollama 安装包默认安装到c盘&#xff0c;安装程序并没有提供选择文件夹安装功能&#xff0c;本来c盘就快满了&#xff0c;下几个模型c盘都快爆了&#xff0c;如何将ollma安装到其他盘呢&#xff1f; ollama 默认安装位置 C:\Users\Admin\.ollama 是 Ollama 用来放大模型的文件夹…

java项目之基于ssm的少儿编程在线培训系统(源码+文档)

项目简介 少儿编程在线培训系统实现了以下功能&#xff1a; 用户信息管理&#xff1a; 用户信息新增 用户信息修改 教师信息管理&#xff1a; 教师信息添加 教师信息删除 教师信息修改 课程信息管理&#xff1a; 课程信息添加 课程信息修改 课程信息删除 课程类型管理&…