使用lombok@Data存在extends時(shí)需要注意的問題
一、可能存在的問題
該類定義了一個(gè)equals方法,該方法覆蓋父類中的equals方法。
兩個(gè)equals方法都使用instanceof來確定兩個(gè)對(duì)象是否相等。
這充滿了危險(xiǎn),因?yàn)橹匾氖莈quals方法是對(duì)稱的(換句話說,a.equals(b) == b.equals(a))。
如果B是a的子類型,并且a的equals方法檢查參數(shù)是a的一個(gè)實(shí)例,B的equals方法檢查參數(shù)是B的一個(gè)實(shí)例,那么很可能這些方法定義的等價(jià)關(guān)系不是對(duì)稱的。
二、解決方法
在Java中,@EqualsAndHashCode(callSuper = true) 是Lombok庫提供的一個(gè)注解,用于簡化生成 equals() 和 hashCode() 方法的代碼。
這個(gè)注解通常用在實(shí)體類或者需要正確實(shí)現(xiàn)這兩個(gè)方法的類上。
@EqualsAndHashCode 注解詳解:
equals()方法:用來比較兩個(gè)對(duì)象是否相等。根據(jù)類中的哪些字段來判斷對(duì)象是否相等可以通過這個(gè)注解進(jìn)行配置。hashCode()方法:當(dāng)兩個(gè)對(duì)象通過equals()方法判斷為相等時(shí),它們的hashCode()方法必須返回相同的值。這也同樣可以通過此注解進(jìn)行配置。
callSuper 參數(shù)的作用:
callSuper = true:這表示在生成的equals()和hashCode()方法內(nèi)部會(huì)調(diào)用父類(superclass)的相應(yīng)方法。- 這意味著子類的
equals()和hashCode()方法將繼承父類中定義的行為,并且會(huì)考慮父類中聲明的字段。
例如:
假設(shè)你有一個(gè)基類 BaseClass 和一個(gè)繼承自它的子類 SubClass,并且你希望在 SubClass 中的 equals() 和 hashCode() 方法也能考慮 BaseClass 中的字段,那么你可以在 SubClass 上使用 @EqualsAndHashCode(callSuper = true)。
三、示例代碼
public class BaseClass {
private int id;
// 構(gòu)造函數(shù)、getter 和 setter 省略...
}
@EqualsAndHashCode(callSuper = true)
public class SubClass extends BaseClass {
private String name;
// 構(gòu)造函數(shù)、getter 和 setter 省略...
}在這個(gè)例子中:
如果 BaseClass 也使用了 Lombok 的 @EqualsAndHashCode 注解,那么 SubClass 的 equals() 和 hashCode() 方法將會(huì)考慮 BaseClass 中的 id 字段以及 SubClass 自己的 name 字段。
如果沒有 callSuper = true,那么 SubClass 的方法將只考慮 name 字段,而忽略 BaseClass 中的任何字段。
四、建議
一般大部分使用到Lombok,主要是使用到其自動(dòng)生成Get和Set方法。
可以直接使用@Getter 和 @Setter避免擴(kuò)散,導(dǎo)致不必要的問題產(chǎn)生。
注意:如果代碼中存在強(qiáng)制轉(zhuǎn)換,需要添加全參構(gòu)造函數(shù)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot集成kafka消費(fèi)手動(dòng)啟動(dòng)停止操作
這篇文章主要介紹了springboot集成kafka消費(fèi)手動(dòng)啟動(dòng)停止操作,本文給大家介紹項(xiàng)目場(chǎng)景及解決分析,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
Netty中ChannelPoolHandler調(diào)用處理程序詳解
這篇文章主要介紹了Netty中ChannelPoolHandler調(diào)用處理程序詳解,Netty 是基于 Java NIO 的異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用框架,使用 Netty 可以快速開發(fā)網(wǎng)絡(luò)應(yīng)用,Netty 提供了高層次的抽象來簡化 TCP 和 UDP 服務(wù)器的編程,但是你仍然可以使用底層的 API,需要的朋友可以參考下2023-11-11
Docker部署Java項(xiàng)目實(shí)踐圖文教程
通過使用Docker,可以實(shí)現(xiàn)Java應(yīng)用程序的快速部署、環(huán)境隔離和擴(kuò)展,下面這篇文章主要介紹了Docker部署Java項(xiàng)目的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-11-11
Spring Dao層@Repository與@Mapper的使用
這篇文章主要介紹了Spring Dao層@Repository與@Mapper的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Java調(diào)用Deepseek-R1.1.5b大模型的超詳細(xì)教程(附代碼)
這篇文章主要為大家介紹了Java調(diào)用Deepseek-R1.1.5b大模型的超詳細(xì)教程并附上了代碼,文中的教程講解詳細(xì),有需要的小伙伴可以參考一下2025-03-03
idea報(bào)錯(cuò):java程序包c(diǎn)om.github.xiaoymin.knife4j.spring.annotations
這篇文章主要介紹了idea報(bào)錯(cuò):java程序包c(diǎn)om.github.xiaoymin.knife4j.spring.annotations不存在問題解決,需要的朋友可以參考下2023-06-06
Spring Boot 集成 Spring AI OpenAI&nbs
本教程詳細(xì)介紹了如何使用SpringBoot集成SpringAIOpenAIStarter,實(shí)現(xiàn)智能對(duì)話功能,包括基礎(chǔ)對(duì)話、帶上下文對(duì)話、高級(jí)參數(shù)控制、流式響應(yīng)以及提示詞工程,本文介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-12-12

