久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

java中l(wèi)ombok的@Data引發(fā)問(wèn)題詳解

瀏覽:2日期:2022-08-25 13:20:56

前言

我們問(wèn)題lombok是可以精簡(jiǎn)我們的代碼的,讓開(kāi)發(fā)人員把精力放在業(yè)務(wù)上,而它封裝的注解我們?cè)谑褂脮r(shí),需要多注意一下;@Data注解它是一個(gè)混合注釋?zhuān)薂Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode的功能,而我們問(wèn)題@EqualsAndHashCode是重寫(xiě)equals和hash的注釋?zhuān)绻闶且粋€(gè)類(lèi),那可以不關(guān)心它;而如果你的類(lèi)中有繼承(父類(lèi)子類(lèi)),那么就要注意一下了。

危險(xiǎn)的@Data

子類(lèi)不能完全代表父類(lèi)

@EqualsAndHashCode注解里有個(gè)字段callSuper,它的默認(rèn)值是false,意思是在重寫(xiě)時(shí),不會(huì)將父類(lèi)的字段寫(xiě)到equals里;而@Data這個(gè)注解由于包含了@EqualsAndHashCode,所以它也有這個(gè)特性,即子類(lèi)強(qiáng)制實(shí)現(xiàn)了重寫(xiě)equals和hashCode,并且只重寫(xiě)了自己的屬性,這時(shí),問(wèn)題就來(lái)了,當(dāng)兩個(gè)對(duì)象比較時(shí),如果子類(lèi)屬性相同而父類(lèi)屬性不同,結(jié)果也為true,這是非常嚴(yán)重的bug。

定義兩種類(lèi),基類(lèi)People,和兩個(gè)子類(lèi)Man和Woman

@Data class Person { String name; } @Data //重寫(xiě)時(shí)帶上父類(lèi)字段 @EqualsAndHashCode(callSuper = true) class Man extends Person { Boolean hunting; } @Data //重寫(xiě)equals時(shí)不會(huì)帶上父類(lèi)的字段,同種類(lèi)型比較時(shí),當(dāng)子類(lèi)字段相同時(shí),結(jié)果就為true,這顯然是不準(zhǔn)確的. @EqualsAndHashCode(callSuper = false) class Woman extends Person { Boolean spin; }

測(cè)試的結(jié)果,我們是可以猜出來(lái)的,父類(lèi)里的字段不相同時(shí),結(jié)果應(yīng)該為false,但如果 @EqualsAndHashCode(callSuper = false),結(jié)果竟然是true,這也是正常的,因?yàn)樗](méi)有重寫(xiě)父類(lèi)的屬性name,所以只要子類(lèi)字段相同,結(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 }

java中l(wèi)ombok的@Data引發(fā)問(wèn)題詳解

總結(jié)

在使用@Data時(shí),我們盡量把 @EqualsAndHashCode(callSuper = true)加上,因?yàn)槟悴患樱喈?dāng)于是false;或者杜絕使用@Data,而用@Getter,@Setter,@ToString代替它。

到此這篇關(guān)于java中l(wèi)ombok的@Data引發(fā)問(wèn)題的文章就介紹到這了,更多相關(guān)java lombok的@Data引發(fā)問(wèn)題內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 午夜精 | 国产成人精品一区二区 | 国产午夜久久 | www.99精品 | 97av| 亚洲欧洲视频在线 | 三级av网站 | 精品国产三级 | 看av网站| 久草久草久草 | 成人超碰在线 | 亚洲黄色一区二区三区 | 一级片在线观看 | 视频一区在线观看 | 国产视频一二区 | 九九资源站 | 欧美福利二区 | 亚洲最大的黄色网 | 国产精品综合 | 日韩国产二区 | 91影院在线观看 | 91小视频| 国产精精品 | 日韩欧美国产精品一区二区三区 | 99精品久久久 | 国产中文在线 | 成人羞羞在线观看网站 | 精品国产18久久久久久二百 | 日韩免费网站 | 免费亚洲视频 | 欧洲成人午夜免费大片 | 黄色一级在线播放 | 国产小视频在线播放 | 日韩精品一区二区在线观看 | 91久久综合 | 国产精品美女久久久久久久久久久 | 免费一二区 | 99国内精品久久久久久久 | www.日韩视频 | 精品国产乱码久久久久久蜜臀 | 日本免费久久 |