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,所以它也有這個特性,即子類強(qiáng)制實(shí)現(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,這也是正常的,因?yàn)樗]有重寫父類的屬性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)加上,因?yàn)槟悴患樱喈?dāng)于是false;或者杜絕使用@Data,而用@Getter,@Setter,@ToString代替它。
到此這篇關(guān)于java中l(wèi)ombok的@Data引發(fā)問題的文章就介紹到這了,更多相關(guān)java lombok的@Data引發(fā)問題內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. python如何實(shí)現(xiàn)word批量轉(zhuǎn)HTML2. 利用單元測試對PHP代碼進(jìn)行檢查3. Java8內(nèi)存模型PermGen Metaspace實(shí)例解析4. python excel和yaml文件的讀取封裝5. python3實(shí)現(xiàn)往mysql中插入datetime類型的數(shù)據(jù)6. python爬蟲實(shí)戰(zhàn)之制作屬于自己的一個IP代理模塊7. moment轉(zhuǎn)化時間戳出現(xiàn)Invalid Date的問題及解決8. App啟動優(yōu)化-Android性能優(yōu)化9. Django 權(quán)限管理(permissions)與用戶組(group)詳解10. Python編寫單元測試代碼實(shí)例
