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

@Data是什么?

@Data 是 Lombok 项目中的一个注解,Lombok 是一种 Java 库,它通过注解来简化代码的编写过程。使用 Lombok 可以帮助开发者减少样板代码(boilerplate code),比如 getter、setter 方法、构造函数、toString 方法等。

作用

  • 自动生成类中所有字段的 getter 和 setter 方法。
  • 自动生成 toString 方法。
  • 自动生成 equals 和 hashCode 方法。
  • 自动生成无参构造函数以及全参构造函数(如果需要)。

如何使用

首先需要在项目中引入 Lombok 依赖。对于 Maven 项目,可以在 pom.xml 文件中添加以下依赖:

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version> <!-- 请根据实际情况选择版本 --><scope>provided</scope>
</dependency>

然后,在需要简化的 Java 类上添加 @Data 注解:

import lombok.Data;@Data
public class User {private Long id;private String name;
}

这样就无需手动为 User 类编写 getter、setter、toString 等方法了。

使用场景

  • 当你需要快速创建实体类或数据传输对象(DTO),并且不希望花费时间编写大量的模板代码时。
  • 在开发过程中为了提高代码的简洁性和可读性,尤其是在领域驱动设计(DDD)中定义领域模型时。
  • 快速原型开发,减少不必要的编码工作量。

内在运行逻辑

Lombok 的工作原理基于编译期处理。当你编译使用了 Lombok 注解的代码时,Lombok 会修改字节码,在编译阶段自动插入所需的额外方法和构造函数。这意味着你在源代码中看不到这些自动生成的方法,但在编译后的类文件中它们是存在的,并且可以像正常编写的方法一样被调用。

需要注意的是,由于 Lombok 修改字节码的过程是在编译期间进行的,因此 IDE 需要相应的插件支持才能正确地识别这些自动生成的方法,避免出现“找不到方法”的错误提示。例如,IntelliJ IDEA 需要安装 Lombok 插件,而 Eclipse 则可以通过安装特定的更新站点来获得支持。

如果没有 @Data 注解,你将手动编写所有 getter、setter、toString、equals 和 hashCode 方法。这些方法虽然功能简单,但写起来非常繁琐,尤其是当类中字段较多时。

🧱 示例:有 @Data 的 ShopPageReqVO

package cn.iocoder.yudao.module.system.controller.admin.shop.vo;import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;@Schema(description = "管理后台 - 商铺分页查询 Request VO")
@Data
@EqualsAndHashCode(callSuper = false)
public class ShopPageReqVO extends PageParam {// 可以在这里添加查询条件字段@Schema(description = "商铺名称")private String shopName;@Schema(description = "管理员姓名")private String manager;@Schema(description = "联系电话")private String phone;@Schema(description = "模糊查询关键字")private String keyword;}

🧱 示例:没有 @Data 的 ShopPageReqVO

以下是 去掉 @Data 后的完整代码,并手动补全了必要的方法:

package cn.iocoder.yudao.module.system.controller.admin.shop.vo;import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.EqualsAndHashCode;import java.util.Objects;@Schema(description = "管理后台 - 商铺分页查询 Request VO")
@EqualsAndHashCode(callSuper = false)
public class ShopPageReqVO extends PageParam {@Schema(description = "商铺名称")private String shopName;@Schema(description = "管理员姓名")private String manager;@Schema(description = "联系电话")private String phone;@Schema(description = "模糊查询关键字")private String keyword;// ========== 手动添加的方法 ==========// Getter and Setter for shopNamepublic String getShopName() {return shopName;}public void setShopName(String shopName) {this.shopName = shopName;}// Getter and Setter for managerpublic String getManager() {return manager;}public void setManager(String manager) {this.manager = manager;}// Getter and Setter for phonepublic String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}// Getter and Setter for keywordpublic String getKeyword() {return keyword;}public void setKeyword(String keyword) {this.keyword = keyword;}// toString 方法@Overridepublic String toString() {return "ShopPageReqVO{" +"shopName='" + shopName + '\'' +", manager='" + manager + '\'' +", phone='" + phone + '\'' +", keyword='" + keyword + '\'' +"} " + super.toString();}// equals 方法@Overridepublic boolean equals(Object o) {if (this == o) return true;if (!(o instanceof ShopPageReqVO)) return false;if (!super.equals(o)) return false;ShopPageReqVO that = (ShopPageReqVO) o;return Objects.equals(shopName, that.shopName) &&Objects.equals(manager, that.manager) &&Objects.equals(phone, that.phone) &&Objects.equals(keyword, that.keyword);}// hashCode 方法@Overridepublic int hashCode() {return Objects.hash(super.hashCode(), shopName, manager, phone, keyword);}
}

http://www.lryc.cn/news/583751.html

相关文章:

  • 打破技术债困境:从“保持现状”到成为变革的推动者
  • 【保姆级喂饭教程】GitLab创建用户规范,分支开发规范,提交日志规范
  • 【基于大模型 + FAISS 的本地知识库与智能 PPT 生成系统:从架构到实现】
  • 【TCP/IP】1. 概述
  • 静态路由实验(2)
  • Linux Vim 编辑器详解:从入门到进阶(含图示+插件推荐)
  • 【Pandas】pandas DataFrame from_dict
  • 「Java案例」输出最大的数及其出现的次数
  • 智能体决策机制深度剖析:ReAct、Plan-and-Execute与自适应策略
  • 灰度发布策略制定方案时可以参考的几个维度
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(四十二) -> 动态修改编译配置
  • C语言 | 函数核心机制深度解构:从底层架构到工程化实践
  • SQL的初步学习(一)(以MySQL为例)
  • 【前端】【Echarts】【Liquidfill 水球图】深入理解 ECharts Liquidfill 水球图:从入门到进阶
  • 京东获得京东商品视频 API 返回值说明item_video-获得京东商品视频 测试演示
  • FS-TAS如何提升电催化反应的效率-测试GO
  • 用闭图像定理证明逆算子定理
  • 【oscp】超长攻击链vulhub靶机,TommyBoy1dot0
  • FCFS,SJF,HRRN三种调度方法详解,先来先服务,短作业优先,最高响应比优先
  • 2025软件测试面试总结(含答案+文档)
  • 【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案
  • CVE-2023-41990/CVE-2023-32434/CVE-2023-38606/CVE-2023-32435
  • 力扣-206.反转链表
  • 搜索算法在前端的实践
  • searxng 对接openweb-UI实现大模型通过国内搜索引擎在线搜索
  • SQL Server通过存储过程调用DLL程序集发送飞书卡片消息
  • Docker 环境下 MySQL 主从复制集群、MGR 搭建及 Nginx 反向代理配置
  • Ajax之核心语法详解
  • 搜索引擎vs向量数据库:LangChain混合检索架构实战解析
  • 【实战】使用 ELK 搭建 Spring Boot Docker 容器日志监控系统