91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中lombok出現危險的@Data怎么解決

發布時間:2020-11-04 16:42:41 來源:億速云 閱讀:307 作者:Leah 欄目:開發技術

java中lombok出現危險的@Data怎么解決?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

前言

我們問題lombok是可以精簡我們的代碼的,讓開發人員把精力放在業務上,而它封裝的注解我們在使用時,需要多注意一下;@Data注解它是一個混合注釋,它包含了@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode的功能,而我們問題@EqualsAndHashCode是重寫equals和hash的注釋,如果你是一個類,那可以不關心它;而如果你的類中有繼承(父類子類),那么就要注意一下了。

危險的@Data

子類不能完全代表父類

@EqualsAndHashCode注解里有個字段callSuper,它的默認值是false,意思是在重寫時,不會將父類的字段寫到equals里;而@Data這個注解由于包含了@EqualsAndHashCode,所以它也有這個特性,即子類強制實現了重寫equals和hashCode,并且只重寫了自己的屬性,這時,問題就來了,當兩個對象比較時,如果子類屬性相同而父類屬性不同,結果也為true,這是非常嚴重的bug。

定義兩種類,基類People,和兩個子類Man和Woman

 @Data
 class Person {
 String name;
 }

 @Data
 //重寫時帶上父類字段
 @EqualsAndHashCode(callSuper = true)
 class Man extends Person {
 Boolean hunting;
 }

 @Data
 //重寫equals時不會帶上父類的字段,同種類型比較時,當子類字段相同時,結果就為true,這顯然是不準確的.
 @EqualsAndHashCode(callSuper = false)
 class Woman extends Person {
 Boolean spin;
 }

測試的結果,我們是可以猜出來的,父類里的字段不相同時,結果應該為false,但如果 @EqualsAndHashCode(callSuper = false),結果竟然是true,這也是正常的,因為它并沒有重寫父類的屬性name,所以只要子類字段相同,結果就認為相同了。

 @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中lombok出現危險的@Data怎么解決

總結

在使用@Data時,我們盡量把 @EqualsAndHashCode(callSuper = true)加上,因為你不加,它相當于是false;或者杜絕使用@Data,而用@Getter,@Setter,@ToString代替它。

關于java中lombok出現危險的@Data怎么解決問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

梁河县| 德惠市| 祁东县| 台东市| 东台市| 丰顺县| 远安县| 山东省| 长沙县| 横峰县| 汉沽区| 汉中市| 平昌县| 当阳市| 历史| 五大连池市| 亳州市| 安泽县| 长葛市| 英吉沙县| 张家界市| 乐东| 威宁| 正蓝旗| 南平市| 许昌市| 天门市| 鲁山县| 通山县| 横峰县| 苏尼特右旗| 依兰县| 容城县| 邛崃市| 仙桃市| 葫芦岛市| 讷河市| 镇坪县| 富民县| 武穴市| 鄂伦春自治旗|