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相同會被覆蓋