java中l(wèi)ombok的@Data引發(fā)問題詳解
前言
我們問題lombok是可以精簡我們的代碼的,讓開發(fā)人員把精力放在業(yè)務(wù)上,而它封裝的注解我們在使用時,需要多注意一下;@Data注解它是一個混合注釋,它包含了@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode的功能,而我們問題@EqualsAndHashCode是重寫equals和hash的注釋,如果你是一個類,那可以不關(guān)心它;而如果你的類中有繼承(父類子類),那么就要注意一下了。
危險的@Data
子類不能完全代表父類
@EqualsAndHashCode注解里有個字段callSuper,它的默認(rèn)值是false,意思是在重寫時,不會將父類的字段寫到equals里;而@Data這個注解由于包含了@EqualsAndHashCode,所以它也有這個特性,即子類強制實現(xiàn)了重寫equals和hashCode,并且只重寫了自己的屬性,這時,問題就來了,當(dāng)兩個對象比較時,如果子類屬性相同而父類屬性不同,結(jié)果也為true,這是非常嚴(yán)重的bug。
定義兩種類,基類People,和兩個子類Man和Woman
@Data
class Person {
String name;
}
@Data
//重寫時帶上父類字段
@EqualsAndHashCode(callSuper = true)
class Man extends Person {
Boolean hunting;
}
@Data
//重寫equals時不會帶上父類的字段,同種類型比較時,當(dāng)子類字段相同時,結(jié)果就為true,這顯然是不準(zhǔn)確的.
@EqualsAndHashCode(callSuper = false)
class Woman extends Person {
Boolean spin;
}
測試的結(jié)果,我們是可以猜出來的,父類里的字段不相同時,結(jié)果應(yīng)該為false,但如果 @EqualsAndHashCode(callSuper = false),結(jié)果竟然是true,這也是正常的,因為它并沒有重寫父類的屬性name,所以只要子類字段相同,結(jié)果就認(rèn)為相同了。
@Test
public void supperSubEqual() {
Man man = new Man();
man.setName("zzl");
man.setHunting(true);
Man man1 = new Man();
man1.setHunting(true);
man1.setName("lind");
log.info("man==man1 ? {}", man.equals(man1)); // false
Woman woman = new Woman();
woman.setName("zzl");
woman.setSpin(true);
Woman woman1 = new Woman();
woman1.setSpin(true);
woman1.setName("lind");
log.info("woman==woman1 ? {}", woman.equals(woman1)); // true
}

總結(jié)
在使用@Data時,我們盡量把 @EqualsAndHashCode(callSuper = true)加上,因為你不加,它相當(dāng)于是false;或者杜絕使用@Data,而用@Getter,@Setter,@ToString代替它。
到此這篇關(guān)于java中l(wèi)ombok的@Data引發(fā)問題的文章就介紹到這了,更多相關(guān)java lombok的@Data引發(fā)問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Validation Api如何實現(xiàn)自定義注解
這篇文章主要介紹了Java Validation Api如何實現(xiàn)自定義注解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
Java注解中@Component和@Bean的區(qū)別
這篇文章主要介紹了@Component和@Bean的區(qū)別,在這給大家簡單介紹下作用對象不同:@Component 注解作用于類,而 @Bean 注解作用于方法,具體實例代碼參考下本文2024-03-03
Java 詳解單向加密--MD5、SHA和HMAC及簡單實現(xiàn)實例
這篇文章主要介紹了Java 詳解單向加密--MD5、SHA和HMAC及簡單實現(xiàn)實例的相關(guān)資料,需要的朋友可以參考下2017-02-02
Mybatis空值關(guān)聯(lián)的具體實現(xiàn)
在復(fù)雜的數(shù)據(jù)庫查詢中,處理空值關(guān)聯(lián)是一項常見的需求,本文就來介紹一下Mybatis空值關(guān)聯(lián)的具體實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
解決IDEA報錯java無效的目標(biāo)發(fā)行版:22
在使用IDEA編譯項目時,可能會遇到JDK版本不一致的錯誤,這篇文章主要介紹了解決IDEA報錯java無效的目標(biāo)發(fā)行版:22的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-10-10
Java中關(guān)于Collections集合工具類的詳細介紹
Java提供了一個操作Set、List和Map等集合的工具類:Collections,該工具提供了大量方法對集合元素進行排序、查詢和修改等操作,還提供了將集合對象設(shè)置為不可變、對集合對象實現(xiàn)同步控制等方法2021-09-09

