java中l(wèi)ombok出現(xiàn)危險(xiǎn)的@Data怎么解決?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。
十年的臨邑網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整臨邑建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“臨邑網(wǎng)站設(shè)計(jì)”,“臨邑網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。前言
我們問題lombok是可以精簡我們的代碼的,讓開發(fā)人員把精力放在業(yè)務(wù)上,而它封裝的注解我們?cè)谑褂脮r(shí),需要多注意一下;@Data注解它是一個(gè)混合注釋,它包含了@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode的功能,而我們問題@EqualsAndHashCode是重寫equals和hash的注釋,如果你是一個(gè)類,那可以不關(guān)心它;而如果你的類中有繼承(父類子類),那么就要注意一下了。
危險(xiǎn)的@Data
子類不能完全代表父類
@EqualsAndHashCode注解里有個(gè)字段callSuper,它的默認(rèn)值是false,意思是在重寫時(shí),不會(huì)將父類的字段寫到equals里;而@Data這個(gè)注解由于包含了@EqualsAndHashCode,所以它也有這個(gè)特性,即子類強(qiáng)制實(shí)現(xiàn)了重寫equals和hashCode,并且只重寫了自己的屬性,這時(shí),問題就來了,當(dāng)兩個(gè)對(duì)象比較時(shí),如果子類屬性相同而父類屬性不同,結(jié)果也為true,這是非常嚴(yán)重的bug。
定義兩種類,基類People,和兩個(gè)子類Man和Woman
@Data class Person { String name; } @Data //重寫時(shí)帶上父類字段 @EqualsAndHashCode(callSuper = true) class Man extends Person { Boolean hunting; } @Data //重寫equals時(shí)不會(huì)帶上父類的字段,同種類型比較時(shí),當(dāng)子類字段相同時(shí),結(jié)果就為true,這顯然是不準(zhǔn)確的. @EqualsAndHashCode(callSuper = false) class Woman extends Person { Boolean spin; }