使用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è)注解,用于簡(jiǎn)化生成 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 EasyPoi動(dòng)態(tài)導(dǎo)入導(dǎo)出的兩種方式實(shí)現(xiàn)方法詳解
項(xiàng)目里使用的是EasyPoi來處理導(dǎo)入導(dǎo)出功能的。近日因業(yè)務(wù)需求調(diào)整,一些導(dǎo)出功能的導(dǎo)出列需要根據(jù)不同的條件動(dòng)態(tài)導(dǎo)出2022-09-09TransmittableThreadLocal線程間傳遞邏輯示例解析
這篇文章主要介紹了TransmittableThreadLocal線程間傳遞邏輯示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Base64加解密的實(shí)現(xiàn)方式實(shí)例詳解
這篇文章主要介紹了Base64加解密的實(shí)現(xiàn)方式實(shí)例詳解的相關(guān)資料,這里提供了實(shí)現(xiàn)實(shí)例,幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下2017-08-08200行java代碼實(shí)現(xiàn)2048小游戲
這篇文章主要為大家詳細(xì)介紹了200行java代碼實(shí)現(xiàn)2048小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04Springboot設(shè)置統(tǒng)一的返回格式的方法步驟
在我們應(yīng)用中我們通常與前端交互使用json格式,設(shè)置統(tǒng)一的返回json 格式是非常必要的,本文主要介紹了Springboot設(shè)置統(tǒng)一的返回格式的方法步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01IntelliJ IDEA語法報(bào)錯(cuò)"Usage of API documented as @since 1.6+"的解決
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA語法報(bào)錯(cuò)"Usage of API documented as @since 1.6+"的解決辦法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10