Lombok常用注解及功能详解

    • 一、Lombok简介与环境配置
      • 1.1 什么是Lombok?
      • 1.2 环境配置
        • 1.2.1 Maven项目
        • 1.2.2 Gradle项目
        • 1.2.3 IDE配置(关键)
    • 二、Lombok常用注解详解
      • 2.1 @Data:一站式生成核心方法
      • 2.2 @Getter/@Setter:单独生成getter/setter
      • 2.3 @ToString:生成toString()方法
      • 2.4 @NoArgsConstructor/@AllArgsConstructor:生成构造方法
      • 2.5 @RequiredArgsConstructor:生成必需字段的构造方法
      • 2.6 @NonNull:字段非空校验
      • 2.7 @Slf4j:简化日志对象创建
      • 2.8 @Builder:实现建造者模式
      • 2.9 @Value:生成不可变类
      • 2.10 @SneakyThrows:简化异常处理
    • 三、Lombok注解组合使用场景
      • 3.1 实体类(POJO)
      • 3.2 服务类(Service)
      • 3.3 不可变DTO
    • 四、Lombok的优缺点与避坑指南
      • 4.1 优点
      • 4.2 缺点
      • 4.3 避坑指南
      • 总结

Java开发中,实体类的getter/setter、构造方法、toString()等模板代码往往占据大量篇幅,不仅编写繁琐,还会降低代码可读性,Lombok通过注解机制自动生成这些模板代码,让我们能够更专注于核心业务逻辑。

一、Lombok简介与环境配置

1.1 什么是Lombok?

Lombok是一个Java库,通过注解处理器在编译期自动生成模板代码(如gettersetter),无需手动编写。它的核心优势是:

  • 减少模板代码,精简类定义;
  • 避免修改字段后忘记更新getter/setter的问题;
  • 提高代码可读性,聚焦业务逻辑。

1.2 环境配置

1.2.1 Maven项目

pom.xml中添加依赖:

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><optional>true</optional> <!-- 避免传递依赖 -->
</dependency>
1.2.2 Gradle项目

build.gradle中添加:

implementation 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
1.2.3 IDE配置(关键)

Lombok通过编译期生成代码,IDE需安装插件才能识别生成的方法(否则会报“方法不存在”错误):

  • IntelliJ IDEA
    1. 打开File → Settings → Plugins
    2. 搜索“Lombok”并安装,重启IDE;
    3. 开启注解处理:Settings → Build, Execution, Deployment → Compiler → Annotation Processors → 勾选Enable annotation processing
  • Eclipse
    1. 安装Lombok插件(官网下载lombok.jar,双击运行并指定Eclipse安装目录);
    2. 重启Eclipse。

二、Lombok常用注解详解

2.1 @Data:一站式生成核心方法

功能:自动生成gettersettertoString()equals()hashCode()方法,以及包含所有字段的构造方法。

使用示例

import lombok.Data;@Data
public class User {private Long id;private String username;private Integer age;
}

等价于手动编写

public class User {private Long id;private String username;private Integer age;// getterpublic Long getId() { return id; }public String getUsername() { return username; }public Integer getAge() { return age; }// setterpublic void setId(Long id) { this.id = id; }public void setUsername(String username) { this.username = username; }public void setAge(Integer age) { this.age = age; }// toStringpublic String toString() { return "User(id=" + id + ", username=" + username + ", age=" + age + ")"; }// equals和hashCode(基于所有字段)public boolean equals(Object o) { /* 实现 */ }public int hashCode() { /* 实现 */ }// 全参构造方法public User(Long id, String username, Integer age) {this.id = id;this.username = username;this.age = age;}
}

注意

  • @Data不包含无参构造方法,若需要需额外添加@NoArgsConstructor
  • 适合POJO类(如实体类、DTO),不建议在复杂业务类中使用。

2.2 @Getter/@Setter:单独生成getter/setter

功能:为类中所有字段(或指定字段)生成getter/setter方法。

使用示例

import lombok.Getter;
import lombok.Setter;@Getter // 为所有字段生成getter
@Setter // 为所有字段生成setter
public class Product {private Long id;private String name;@Getter(AccessLevel.PRIVATE) // 仅为price生成private getter@Setter(AccessLevel.PROTECTED) // 仅为price生成protected setterprivate Double price;
}

关键参数

  • AccessLevel:指定方法访问权限(PUBLICPROTECTEDPACKAGEPRIVATE),默认PUBLIC

适用场景

  • 只需生成部分字段的getter/setter
  • 需要控制getter/setter的访问权限。

2.3 @ToString:生成toString()方法

功能:生成包含类名和字段的toString()方法,可指定包含/排除字段。

使用示例

import lombok.ToString;@ToString(includeFieldNames = true, // 输出字段名(默认true)exclude = "password", // 排除password字段of = {"username", "age"} // 仅包含指定字段(与exclude二选一)
)
public class User {private Long id;private String username;private Integer age;private String password;
}

生成的toString()

public String toString() {return "User(username=" + username + ", age=" + age + ")";
}

注意

  • excludeof不可同时使用;
  • 若继承父类,可添加callSuper = true包含父类的toString()结果(默认false)。

2.4 @NoArgsConstructor/@AllArgsConstructor:生成构造方法

  • @NoArgsConstructor:生成无参构造方法;
  • @AllArgsConstructor:生成包含所有字段的构造方法。

使用示例

import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;@NoArgsConstructor
@AllArgsConstructor
public class Book {private String isbn;private String title;private String author;
}

生成的构造方法

// 无参构造
public Book() {}// 全参构造
public Book(String isbn, String title, String author) {this.isbn = isbn;this.title = title;this.author = author;
}

注意

  • 若类中已有构造方法,@NoArgsConstructor会覆盖默认无参构造(若未显式定义);
  • 配合@Data使用时,需显式添加@NoArgsConstructor(因@Data不包含无参构造)。

2.5 @RequiredArgsConstructor:生成必需字段的构造方法

功能:为final或被@NonNull标注的字段生成构造方法。

使用示例

import lombok.RequiredArgsConstructor;
import lombok.NonNull;@RequiredArgsConstructor
public class Order {private final Long orderId; // final字段(必需)@NonNull private String productName; // @NonNull标注(必需)private Integer quantity; // 普通字段(非必需)
}

生成的构造方法

public Order(Long orderId, String productName) {this.orderId = orderId;if (productName == null) {throw new NullPointerException("productName is marked non-null but is null");}this.productName = productName;
}

适用场景

  • 依赖注入(如构造方法注入@Autowired);
  • 确保核心字段必须初始化。

2.6 @NonNull:字段非空校验

功能:在构造方法或setter中为字段添加非空校验,若为null则抛出NullPointerException

使用示例

import lombok.NonNull;
import lombok.Setter;public class User {private Long id;@NonNull private String username; // 非空校验@Setter@NonNull private Integer age; // setter中添加非空校验
}

生成的代码

public class User {private Long id;private String username;private Integer age;public User(String username) {if (username == null) {throw new NullPointerException("username is marked non-null but is null");}this.username = username;}public void setAge(Integer age) {if (age == null) {throw new NullPointerException("age is marked non-null but is null");}this.age = age;}
}

注意@NonNull需配合构造方法或setter使用(如与@Data@Setter等注解一起用)。

2.7 @Slf4j:简化日志对象创建

功能:自动生成日志对象(private static final Logger log = LoggerFactory.getLogger(类名.class);),支持主流日志框架(Logback、Log4j2等)。

使用示例

import lombok.extern.slf4j.Slf4j;@Slf4j // 生成log对象
public class OrderService {public void createOrder() {log.info("开始创建订单"); // 直接使用log对象try {// 业务逻辑log.debug("订单创建成功");} catch (Exception e) {log.error("订单创建失败", e); // 打印异常}}
}

等价于手动编写

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class OrderService {private static final Logger log = LoggerFactory.getLogger(OrderService.class);public void createOrder() {log.info("开始创建订单");// ...}
}

类似注解

  • @Log:对应java.util.logging.Logger
  • @Log4j:对应Log4j 1.x;
  • @Log4j2:对应Log4j 2.x。
  • 推荐使用@Slf4j(Slf4j是日志门面,可适配不同日志框架)。

2.8 @Builder:实现建造者模式

功能:为类生成建造者模式代码,支持链式调用创建对象。

使用示例

import lombok.Builder;
import lombok.ToString;@Builder
@ToString
public class User {private Long id;private String username;private Integer age;
}

使用建造者创建对象

public class Test {public static void main(String[] args) {// 链式调用设置属性User user = User.builder().id(1L).username("张三").age(20).build(); // 构建对象System.out.println(user); // 输出:User(id=1, username=张三, age=20)}
}

优势

  • 相比构造方法,无需记忆参数顺序;
  • 支持选择性设置字段(无需为可选字段创建多个构造方法)。

注意@Builder默认生成全参私有构造方法,若需公开构造方法,需配合@NoArgsConstructor@AllArgsConstructor

2.9 @Value:生成不可变类

功能:生成不可变类(类似@Data,但字段默认为final,且无setter)。

使用示例

import lombok.Value;@Value
public class ImmutableUser {Long id;String username;Integer age;
}

生成的代码特点

  • 所有字段被final修饰(不可修改);
  • 生成getter,但无setter
  • 生成全参构造方法(必须初始化所有字段);
  • 生成toString()equals()hashCode()

适用场景

  • 存储常量数据(如配置信息);
  • 线程安全的不可变对象。

2.10 @SneakyThrows:简化异常处理

功能:自动捕获受检异常(Checked Exception)并包装为运行时异常抛出,无需显式try-catchthrows声明。

使用示例

import lombok.SneakyThrows;
import java.io.FileInputStream;public class FileUtil {// 无需声明throws IOException@SneakyThrowspublic static void readFile() {FileInputStream fis = new FileInputStream("test.txt");// ...}
}

生成的代码

public class FileUtil {public static void readFile() {try {FileInputStream fis = new FileInputStream("test.txt");} catch (IOException e) {throw new RuntimeException(e); // 包装为运行时异常}}
}

注意

  • 谨慎使用,可能隐藏异常类型(调用者无法通过throws声明感知受检异常);
  • 适合简化工具类中的异常处理。

三、Lombok注解组合使用场景

3.1 实体类(POJO)

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.ToString;@Data // getter、setter、toString等
@NoArgsConstructor // 无参构造(JSON反序列化需要)
@AllArgsConstructor // 全参构造(测试用)
@ToString(exclude = "password") //  toString排除密码
public class User {private Long id;private String username;@NonNull // 非空校验private String password;private Integer age;
}

3.2 服务类(Service)

import lombok.extern.slf4j.Slf4j;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;@Service
@Slf4j // 日志
@RequiredArgsConstructor // 构造方法注入依赖
public class UserService {private final UserMapper userMapper; // final字段(构造方法注入)public User getUserById(Long id) {log.info("查询用户ID:{}", id);return userMapper.selectById(id);}
}

3.3 不可变DTO

import lombok.Value;
import lombok.Builder;@Value // 不可变类
@Builder // 支持建造者模式创建
public class UserDTO {Long id;String username;Integer age;
}

四、Lombok的优缺点与避坑指南

4.1 优点

  1. 减少模板代码:省去大量gettersetter等重复代码;
  2. 提高开发效率:新增字段时无需手动更新相关方法;
  3. 代码更简洁:聚焦核心业务逻辑,可读性提升。

4.2 缺点

  1. 强依赖插件:IDE必须安装Lombok插件,否则会报错;
  2. 调试困难:生成的代码在源码中不可见,调试时需查看编译后的class文件;
  3. 过度使用风险:滥用@Data可能导致类职责不清晰;
  4. 兼容性问题:某些框架(如序列化工具)可能无法识别生成的方法。

4.3 避坑指南

  1. 避免在父类使用@Data:子类继承后可能导致equals()hashCode()逻辑错误;
  2. 谨慎使用@SneakyThrows:不要在业务核心逻辑中隐藏受检异常,以免影响异常处理;
  3. 序列化注意:若类需要序列化(如实现Serializable),建议手动编写serialVersionUID(Lombok不自动生成);
  4. 版本兼容:确保Lombok版本与JDK版本兼容(如JDK 17需Lombok 1.18.20+);
  5. 代码审查:生成的代码虽不可见,但需在审查时考虑其逻辑(如equals()是否符合预期)。

总结

核心推荐注解:

  • 实体类:@Data + @NoArgsConstructor + @AllArgsConstructor
  • 服务类:@Slf4j + @RequiredArgsConstructor
  • 不可变对象:@Value
  • 日志:@Slf4j

若这篇内容帮到你,动动手指支持下!关注不迷路,干货持续输出!
ヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノ

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

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

相关文章

应用分层

应用分层是⼀种软件开发设计思想&#xff0c;它将应用程序分成N个层次&#xff0c;这N个层次分别负责各自的职责&#xff0c; 多个层次之间协同提供完整的功能。根据项目的复杂度&#xff0c;把项目分成三层&#xff0c;四层或者更多层。常见的MVC设计模式&#xff0c;就是应用…

[特殊字符] 【JAVA进阶】StringBuilder全方位解析:从使用到源码,一文搞定!

&#x1f525; 掌握StringBuilder&#xff0c;让你的Java字符串操作性能飙升&#xff01;&#x1f9e9; StringBuilder是什么&#xff1f; StringBuilder是Java中用于动态构建字符串的可变字符序列类&#xff0c;位于java.lang包中。与不可变的String类不同&#xff0c;StringB…

Redis 数据结构全景解析

Redis 不是简单的 key-value 缓存&#xff0c;它更像一把“瑞士军刀”。 只要掌握数据结构&#xff0c;就能把同一份内存用出 10 倍效率。0. 开场白&#xff1a;为什么聊数据结构&#xff1f; 面试常问“Redis 有几种数据类型&#xff1f;”——很多人答 5 种&#xff08;Strin…

ansible.cfg 配置文件的常见配置项及其说明

配置项说明默认值defaults默认配置部分inventory指定清单文件的位置&#xff0c;可以是文件路径、目录或动态清单脚本。/etc/ansible/hostsremote_user默认的远程用户roothost_key_checking是否启用主机密钥检查。设置为 False 跳过 SSH 主机密钥验证。Trueask_pass是否在执行时…

Effective C++ 条款15:在资源管理类中提供对原始资源的访问

Effective C 条款15&#xff1a;在资源管理类中提供对原始资源的访问核心思想&#xff1a;RAII类需要提供访问其封装原始资源的显式或隐式接口&#xff0c;以兼容需要直接操作资源的API&#xff0c;同时维持资源的安全管理。 ⚠️ 1. 原始资源访问的必要性 使用场景示例&#x…

Linux 进程管理与计划任务设置

Linux 进程管理与计划任务设置一、进程管理进程管理用于监控、控制系统中运行的程序&#xff08;进程&#xff09;&#xff0c;包括查看进程状态、调整优先级、终止异常进程等。以下是核心命令及操作说明&#xff1a;1. 常用进程查看命令&#xff08;1&#xff09;ps&#xff1…

MYSQL数据库之索引

1、引入索引的问题在图书馆查找一本书的过程&#xff0c;可类比数据库查询场景。在一般软件系统中&#xff0c;对数据库操作以查询为主&#xff0c;数据量较大时&#xff0c;优化查询是关键&#xff0c;索引便是优化查询的重要手段 。2、索引是什么索引是一种特殊文件&#xff…

ArcGIS以及ArcGIS Pro如何去除在线地图制作者名单

问题&#xff1a;ArcGIS和ArcGIS Pro提供了许多在线地图服务&#xff0c;但是这些地图会自动生成制作者名单&#xff0c;如下图所示&#xff1a; 在线地图加载方式可参考&#xff1a;如何在ArcGIS和ArcGIS Pro中添加在线底图 这在出图时有时会造成图的部分信息遮挡或出图不美观…

InfluxDB 与 Golang 框架集成:Gin 实战指南(二)

四、实际应用案例4.1 案例背景某智能工厂部署了大量的物联网设备&#xff0c;如传感器、智能仪表等&#xff0c;用于实时监测生产线上设备的运行状态、环境参数&#xff08;如温度、湿度&#xff09;以及生产过程中的各项指标&#xff08;如产量、次品率&#xff09;。这些设备…

Linux系统磁盘未分配的空间释放并分配给 / 根目录的详细操作【openEuler系统】

选择 Fix 修正 GPT 表 输入 Fix 并按回车&#xff0c;parted 会自动&#xff1a; 扩展 GPT 表的 结束位置 到磁盘末尾。释放未被使用的空间&#xff08;1048576000 个 512B 块&#xff0c;约 500GB&#xff09;。 验证修正结果 修正后&#xff0c;再次运行&#xff1a; parted …

王道考研-数据结构-01

数据结构-01视频链接&#xff1a;https://www.bilibili.com/video/BV1b7411N798?spm_id_from333.788.videopod.sections&vd_source940d88d085dc79e5d2d1c6c13ec7caf7&p2 数据结构到底在学什么? 数据结构这门课他要学习的就是怎么用程序代码把现实世界的问题给信息化&…

k8s云原生rook-ceph pvc快照与恢复(上)

#作者&#xff1a;Unstopabler 文章目录前言部署rook-ceph on kubernets条件Ceph快照概述什么是PVC安装快照控制器和CRD1.安装crds资源2.安装控制器3.安装快照类前言 Rook 是一个开源的云原生存储编排器&#xff0c;为各种存储解决方案提供平台、框架和支持&#xff0c;以便与…

springcloud04——网关gateway、熔断器 sentinel

目录 注册中心 nacos | eurekaServer |zookeeper(dubbo) 配置中心 nacos | config Server 远程服务调用 httpClient | RestTemplate | OpenFeign 负载均衡服务 ribbon | loadbalancer 网关 zuul | gateway 熔断器 hystrix | sentinel 网关 sentinel 流控 压测工具 1…

XSS跨站脚本攻击详解

一、XSS攻击简介跨站脚本攻击的英文全称是Cross-Site Scripting&#xff0c;为了与CSS有所区别&#xff0c;因此缩写为“XSS”由于同源策略的存在&#xff0c;攻击者或者恶意网站的JavaScript代码没有办法直接获取用户在其它网站的信息&#xff0c;但是如果攻击者有办法把恶意的…

Linux /proc/目录详解

文章目录前言文件说明注意事项前言 在 Linux 系统中&#xff0c;/proc 目录是一个特殊的虚拟文件系统&#xff0c;它提供了对系统内核和进程的访问。/proc 目录中的文件和目录不是真实存在的&#xff0c;它们是在运行时由内核动态生成的&#xff0c;用于提供系统和进程的相关信…

北斗变形监测在地质灾害监测中的应用

内容概要 北斗形变监测系统在地质灾害监测领域发挥着核心作用&#xff0c;该系统基于北斗卫星导航技术&#xff0c;实现对地表变形的精确追踪。通过毫米级精度定位能力&#xff0c;北斗形变监测技术为滑坡等灾害提供关键数据支撑&#xff0c;尤其在偏远地区应用中&#xff0c;单…

2025新征程杯全国54校园足球锦标赛在北京世园公园隆重开幕

2025年8月1日&#xff0c;备受瞩目的2025新征程杯全国54校园足球锦标赛&#xff08;北京&#xff09;在北京世园公园盛大拉开帷幕。开幕式上&#xff0c;中国关心下一代健康体育基金会副秘书长、中国青少年研究会理事、全国 54 校园足球人才培养计划创始人何占强主任表示&#…

分类预测 | Matlab实现CPO-PNN冠豪猪算法优化概率神经网络多特征分类预测

分类预测 | Matlab实现CPO-PNN冠豪猪算法优化概率神经网络多特征分类预测 目录分类预测 | Matlab实现CPO-PNN冠豪猪算法优化概率神经网络多特征分类预测分类效果基本介绍程序设计分类效果 基本介绍 1.Matlab实现CPO-PNN冠豪猪算法优化概率神经网络多特征分类预测&#xff0c;运…

机器学习——逻辑回归(LogisticRegression)的核心参数:以约会数据集为例

理解 LogisticRegression 的核心参数&#xff1a;以约会数据集为例 逻辑回归&#xff08;Logistic Regression&#xff09;是机器学习中一种基础且重要的分类算法&#xff0c;特别适用于解决二分类和多分类问题。本文将基于 sklearn.linear_model.LogisticRegression 的用法&a…

深入解析 Apache Flink FLIP-511:优化 Kafka Sink 事务处理,减轻 Broker 负载

一、 背景与核心问题&#xff1a;Kafka Sink 事务的痛点 Flink Kafka Sink 在 Exactly-Once 模式下依赖 Kafka 事务来确保数据写入的原子性&#xff0c;并与 Flink 检查点对齐。然而&#xff0c;非优雅关闭&#xff08;如任务失败、非 stop-with-savepoint 的停止&#xff09;会…