Lombok 的 @EqualsAndHashCode(callSuper = false) 的使用


轉:(11條消息) Lombok 的 @EqualsAndHashCode(callSuper = false) 的使用_請叫我大師兄-CSDN博客_equalsandhashcode

這個注解的作用就是自動的給model bean實現equals方法和hashcode方法。

但是,這個參數,callsuper = false 有問題嗎?

你在使用這個注解的時候,確定知道“為什么要重寫hashcode和equals方法嗎?”

先看下面的測試。

兩個model的代碼我就截圖啦:父類 TV.java 和 子類 小米TV.java,使用這個注解@EqualsAndHashCode(callSuper = false) 

 

 

 

 

小米tv繼承tv,從繼承角度講tv有的屬性,小米tv也是有的。

看測試main方法

import com.lxk.model.XiaoMiTV;

/**
* 測試@EqualsAndHashCode注解的使用
*
* @author LiXuekai on 2019/5/10
*/
public class EqualsAndHashCodeTest {
public static void main(String[] args) {
XiaoMiTV tv1 = new XiaoMiTV("123", "lxk", 1L, "白");
XiaoMiTV tv2 = new XiaoMiTV("456", "sql", 1L, "白");
System.out.println(tv1.equals(tv2));
}
}

來吧,大膽猜測一下,這個代碼的運行結果。true還是false?

猜完了,來看下運行結果圖:

 

 

 

這個因為咱在子類里面這么使用@EqualsAndHashCode(callSuper = false) ,不調用父類的屬性,那么子類屬性里面的相同的話,那hashcode的值就相同啦,所以代碼里面的2個tv的equals方法的返回值是true

那么,把@EqualsAndHashCode(callSuper = false) 的false改成true之后的結果呢?

來,再猜測一下。

猜完了,看運行結果(就只改@EqualsAndHashCode(callSuper = false) 里面的false改成true)

 

這個估計就好猜了。@EqualsAndHashCode(callSuper = true),那就是用自己的屬性和從父類繼承的屬性 來生成hashcode,比較的結果就好猜啦。

那么,再把@EqualsAndHashCode(callSuper = false) 這個語句注釋了呢?這個時候代碼運行結果如何?

來,還是再猜一下吧。

猜完了,看下運行結果圖

 

 

 

竟然是true,原來他默認就是不管父類繼承的屬性的。

看Lombok的提示:

自動生成hashcode和equals方法,但是沒call super,雖然這個class不是直接extends Object類,如果這是故意的,那么請加上@EqualsAndHashCode(callSuper = false) 這句話到你的model上。

非常建議:

去了解下為啥要重寫hashcode和equals方法。要是說你覺得你造了,那再問一下,set為啥能去重復呢?剛剛那2個tv都放到一個set里面,能放進去嗎?深入了解一下吧。

因為set用hashcode確定位置,hashcode相同會被覆蓋


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM