Java中的@Data是什么以及如何使用
作者:姜太公钓鲸233
@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 shopName public String getShopName() { return shopName; } public void setShopName(String shopName) { this.shopName = shopName; } // Getter and Setter for manager public String getManager() { return manager; } public void setManager(String manager) { this.manager = manager; } // Getter and Setter for phone public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } // Getter and Setter for keyword public String getKeyword() { return keyword; } public void setKeyword(String keyword) { this.keyword = keyword; } // toString 方法 @Override public String toString() { return "ShopPageReqVO{" + "shopName='" + shopName + '\'' + ", manager='" + manager + '\'' + ", phone='" + phone + '\'' + ", keyword='" + keyword + '\'' + "} " + super.toString(); } // equals 方法 @Override public 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 方法 @Override public int hashCode() { return Objects.hash(super.hashCode(), shopName, manager, phone, keyword); } }
到此这篇关于@Data是什么?的文章就介绍到这了,更多相关@Data是什么内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!