1. 程式人生 > >lombok註解@Data使用在繼承類上時出現警告

lombok註解@Data使用在繼承類上時出現警告

lombok為我們提供了@Data註解,幫助我們省略了@Setter,@Getter,@ToString等註解,一般對於普通的實體類使用該註解,不會出現什麼問題,但是當我們把這個註解,使用在派生類上,就出現了一個小問題。

基類:

派生類:

@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;
}

當我們根據警告提示,加上註解@EqualsAndHahsCode(superCall=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(superCall=true)時,變成了int result=super.hashCode()。

這麼一來,好像就解決了在繼承情況下使用@Data註解的警告問題。但是問題是,每一個繼承的類,都需要這麼來解決,也不是很方便。在stackoverflow上,就有人提出了這個問題:https://stackoverflow.com/questions/38572566/warning-equals-hashcode-on-data-annotation-lombok-with-inheritance,另外,lombok作者Roel也給出瞭解決辦法,就是通過自定義lombok.config檔案來解決。

按照Roel的說法,lombok.config檔案需要放在src/main/java資料夾下的目錄中(也可以放在實體同級目錄下),放在src/main/resources目錄下,不會生效。下面,我們通過這種方式來解決這個警告的問題。

1、新建lombok.config檔案,然後配置:

config.stopBubbling=true
lombok.equalsAndHashCode.callSuper=call

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註解這裡的警告也立馬消失了。