lombok注解@Data使用在繼承類上時出現警告的問題及解決
lombok為我們提供了@Data注解,幫助我們省略了@Setter,@Getter,@ToString等注解,一般對于普通的實體類使用該注解,不會出現什么問題,但是當我們把這個注解,使用在派生類上,就出現了一個警告
1 情景再現
- 父類:
@Data public class BaseEntity { /** * 公共字段主鍵id */ private Integer id; /** * 公共字段創(chuàng)建時間 */ private Date createTime; /** * 公共字段更新時間 */ private Date updateTime; }
- 子類:
@Data public class User extends BaseEntity { /** * 用戶名 */ private String username; /** * 密碼 */ private String password; }
此時,idea中顯示,在子類的@Data注解的地方會出現警告,如圖:
出現的警告信息:
Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type.
大致意思是默認子類的equals和hashCode方法,不會包含或者考慮基類的屬性。
我們可以通過反編譯工具查看項目target/classes目錄下的User.class的hashCode方法,默認情況下屬性都是使用的他自身的屬性。
public int hashCode() { int PRIME = 59; int result = 1; Object $username = getUsername(); result = result * 59 + ($username == null ? 43 : $username.hashCode()); Object $password = getPassword(); result = result * 59 + ($password == null ? 43 : $password.hashCode()); Object $mobile = getMobile(); result = result * 59 + ($mobile == null ? 43 : $mobile.hashCode()); return result; }
2 解決方案一(添加注解)
在警告的父類加上注解@EqualsAndHashCode(callSuper=true) ,警告消失
這時候,我們再來看我們的User.class中的hashCode方法:
public int hashCode() { int PRIME = 59; int result = super.hashCode(); Object $username = getUsername(); result = result * 59 + ($username == null ? 43 : $username.hashCode()); Object $password = getPassword(); result = result * 59 + ($password == null ? 43 : $password.hashCode()); Object $mobile = getMobile(); result = result * 59 + ($mobile == null ? 43 : $mobile.hashCode()); return result; }
可以看出代碼中不一樣的地方,默認情況下是int result=1,當添加注解@EqualsAndHashCode(callSuper=true)時,變成了int result=super.hashCode()。
這么一來,好像就解決了在繼承情況下使用@Data注解的警告問題。
但是問題是,每一個繼承的類,都需要這么來解決,也不是很方便。所以,lombok作者Roel也給出了解決辦法,就是通過自定義lombok.config文件來解決。
3 解決方案二(配置lombok.config)
lombok.config文件需要放在src/main/java文件夾下的目錄中(也可以放在實體同級目錄下),放在src/main/resources目錄下,不會生效。
下面,我們通過這種方式來解決這個警告的問題。
- 3.1 新建lombok.config文件,然后配置:
config.stopBubbling=true lombok.equalsAndHashCode.callSuper=call
- 3.2 pom.xml文件中需要加入如下插件:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin>
經過上兩步步驟警告已經消失,如圖:
可以看到,配置生效了,然后@Data注解這里的警告也立馬消失了。
4 說明
如果父類沒添加@Data注解,子類如果要去掉警告的話,也需要在子類@EqualsAndHashCode(callSuper=true)注解
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
詳解使用Spring的restTemplete進行Http請求
本篇文章主要介紹了詳解使用Spring的restTemplete進行Http請求,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06解決IDEA中下載free maven plugin插件無效的問題
這篇文章主要介紹了解決IDEA中下載free maven plugin插件無效的問題,本文通過圖文并茂的形式給大家分享解決方案,供大家參考,需要的朋友可以參考下2020-11-11Java ArrayList與LinkedList使用方法詳解
Java中容器對象主要用來存儲其他對象,根據實現原理不同,主要有3類常用的容器對象:ArrayList使用數組結構存儲容器中的元素、LinkedList使用鏈表結構存儲容器中的元素2022-11-11Spring的RedisTemplate存儲的key和value有特殊字符的處理
這篇文章主要介紹了Spring的RedisTemplate存儲的key和value有特殊字符的處理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12使用Mybatis的Batch?Insert?Support?實現批量插入
這篇文章主要介紹了使用Mybatis的Batch?Insert?Support?實現批量插入。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07