Java中的@Data是什么以及如何使用
@Data 是 Lombok 項(xiàng)目中的一個(gè)注解,Lombok 是一種 Java 庫(kù),它通過(guò)注解來(lái)簡(jiǎn)化代碼的編寫過(guò)程。使用 Lombok 可以幫助開發(fā)者減少樣板代碼(boilerplate code),比如 getter、setter 方法、構(gòu)造函數(shù)、toString 方法等。
作用
- 自動(dòng)生成類中所有字段的
getter和setter方法。 - 自動(dòng)生成
toString方法。 - 自動(dòng)生成
equals和hashCode方法。 - 自動(dòng)生成無(wú)參構(gòu)造函數(shù)以及全參構(gòu)造函數(shù)(如果需要)。
如何使用
首先需要在項(xiàng)目中引入 Lombok 依賴。對(duì)于 Maven 項(xiàng)目,可以在 pom.xml 文件中添加以下依賴:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version> <!-- 請(qǐng)根據(jù)實(shí)際情況選擇版本 -->
<scope>provided</scope>
</dependency>然后,在需要簡(jiǎn)化的 Java 類上添加 @Data 注解:
import lombok.Data;
@Data
public class User {
private Long id;
private String name;
}這樣就無(wú)需手動(dòng)為 User 類編寫 getter、setter、toString 等方法了。
使用場(chǎng)景
- 當(dāng)你需要快速創(chuàng)建實(shí)體類或數(shù)據(jù)傳輸對(duì)象(DTO),并且不希望花費(fèi)時(shí)間編寫大量的模板代碼時(shí)。
- 在開發(fā)過(guò)程中為了提高代碼的簡(jiǎn)潔性和可讀性,尤其是在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)中定義領(lǐng)域模型時(shí)。
- 快速原型開發(fā),減少不必要的編碼工作量。
內(nèi)在運(yùn)行邏輯
Lombok 的工作原理基于編譯期處理。當(dāng)你編譯使用了 Lombok 注解的代碼時(shí),Lombok 會(huì)修改字節(jié)碼,在編譯階段自動(dòng)插入所需的額外方法和構(gòu)造函數(shù)。這意味著你在源代碼中看不到這些自動(dòng)生成的方法,但在編譯后的類文件中它們是存在的,并且可以像正常編寫的方法一樣被調(diào)用。
需要注意的是,由于 Lombok 修改字節(jié)碼的過(guò)程是在編譯期間進(jìn)行的,因此 IDE 需要相應(yīng)的插件支持才能正確地識(shí)別這些自動(dòng)生成的方法,避免出現(xiàn)“找不到方法”的錯(cuò)誤提示。例如,IntelliJ IDEA 需要安裝 Lombok 插件,而 Eclipse 則可以通過(guò)安裝特定的更新站點(diǎn)來(lái)獲得支持。
如果沒有 @Data 注解,你將手動(dòng)編寫所有 getter、setter、toString、equals 和 hashCode 方法。這些方法雖然功能簡(jiǎn)單,但寫起來(lái)非常繁瑣,尤其是當(dāng)類中字段較多時(shí)。
?? 示例:有 @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 = "管理后臺(tái) - 商鋪分頁(yè)查詢 Request VO")
@Data
@EqualsAndHashCode(callSuper = false)
public class ShopPageReqVO extends PageParam {
// 可以在這里添加查詢條件字段
@Schema(description = "商鋪名稱")
private String shopName;
@Schema(description = "管理員姓名")
private String manager;
@Schema(description = "聯(lián)系電話")
private String phone;
@Schema(description = "模糊查詢關(guān)鍵字")
private String keyword;
}?? 示例:沒有@Data的ShopPageReqVO
以下是 去掉 @Data 后的完整代碼,并手動(dòng)補(bǔ)全了必要的方法:
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 = "管理后臺(tái) - 商鋪分頁(yè)查詢 Request VO")
@EqualsAndHashCode(callSuper = false)
public class ShopPageReqVO extends PageParam {
@Schema(description = "商鋪名稱")
private String shopName;
@Schema(description = "管理員姓名")
private String manager;
@Schema(description = "聯(lián)系電話")
private String phone;
@Schema(description = "模糊查詢關(guān)鍵字")
private String keyword;
// ========== 手動(dòng)添加的方法 ==========
// 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);
}
}到此這篇關(guān)于@Data是什么?的文章就介紹到這了,更多相關(guān)@Data是什么內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java如何解決發(fā)送Post請(qǐng)求報(bào)Stream?closed問(wèn)題
這篇文章主要介紹了Java如何解決發(fā)送Post請(qǐng)求報(bào)Stream?closed問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
SpringBoot構(gòu)建Docker鏡像的實(shí)現(xiàn)步驟
本文主要介紹了SpringBoot構(gòu)建Docker鏡像的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-05-05
java:?程序包javafx.fxml不存在問(wèn)題一些可能的解決方案
在Java編程過(guò)程中,經(jīng)常會(huì)遇到“程序包不存在”的錯(cuò)誤消息,下面這篇文章主要介紹了關(guān)于java:?程序包javafx.fxml不存在問(wèn)題一些可能的解決方案,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-10-10
解決SpringBoot webSocket 資源無(wú)法加載、tomcat啟動(dòng)報(bào)錯(cuò)的問(wèn)題
這篇文章主要介紹了解決SpringBoot webSocket 資源無(wú)法加載、tomcat啟動(dòng)報(bào)錯(cuò)的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
SpringBoot Redis緩存數(shù)據(jù)實(shí)現(xiàn)解析
這篇文章主要介紹了SpringBoot Redis緩存數(shù)據(jù)實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Java實(shí)現(xiàn)矩陣順時(shí)針旋轉(zhuǎn)90度的示例
今天小編就為大家分享一篇Java實(shí)現(xiàn)矩陣順時(shí)針旋轉(zhuǎn)90度的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
Java8中關(guān)于Function.identity()的使用
這篇文章主要介紹了Java8中關(guān)于Function.identity()的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
利用Java查看進(jìn)程內(nèi)存占用情況的實(shí)現(xiàn)方法
在系統(tǒng)監(jiān)控和性能調(diào)優(yōu)中,了解各個(gè)進(jìn)程的內(nèi)存占用情況是非常重要的一環(huán),通過(guò)查看進(jìn)程內(nèi)存使用情況,開發(fā)者和運(yùn)維人員可以及時(shí)發(fā)現(xiàn)異常進(jìn)程、資源瓶頸和內(nèi)存泄漏問(wèn)題,本項(xiàng)目旨在使用 Java 編寫一個(gè)簡(jiǎn)單的程序,通過(guò)調(diào)用操作系統(tǒng)的命令來(lái)獲取系統(tǒng)中各個(gè)進(jìn)程的內(nèi)存使用情況2025-03-03

