Lombok 在繼承類上面的注意


找不到符號異常

在控制台項目中配置Lombok

編譯會報錯 找不到符號

解決 方法:

父類字段ToString不了

@Data
@NoArgsConstructor
@AllArgsConstructor
public class School {

  public int id;

  public String name;

  public String age;

}

@Data
class ShangHai extends School {
  private String type;
}

測試:

public class test1 {

	public static void main(String[] args) {

		ShangHai shangHai = new ShangHai();
	 	shangHai.setId(1);
     	shangHai.setName("上海大學");
		shangHai.setType("A");
		System.out.println(JSON.toJSONString(shangHai));
		System.out.println(shangHai.hashCode());
		ShangHai shangHai2 = new ShangHai();
		shangHai2.setId(2);
		shangHai2.setName("華東師范");
		shangHai2.setType("A");
		System.out.println(shangHai2.hashCode());
		System.out.println(JSON.toJSONString(shangHai2));
		System.out.println(shangHai.equals(shangHai2));
		System.out.println(shangHai.toString());
		System.out.println(shangHai2.toString());
	}
}

Output:

{"id":1,"name":"上海大學","type":"A"}
124
124
{"id":2,"name":"華東師范","type":"A"}
true
ShangHai(type=A)
ShangHai(type=A)

可以明顯發現,School類里面的字段都沒有toString,並且equals還是相等的。

解決:

@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
class ShangHai extends School {
  private String type;
}

輸出;

{"id":1,"name":"上海大學","type":"A"}
-890203766
549614978
{"id":2,"name":"華東師范","type":"A"}
false
ShangHai(super=School(id=1, name=上海大學, age=null), type=A)
ShangHai(super=School(id=2, name=華東師范, age=null), type=A)

其實在上面的情況時,鼠標放在@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目錄下的ShangHai.class的hashCode方法,默認情況下屬性都是使用的他自身的屬性。

當我們根據警告提示,加上注解@EqualsAndHahsCode(superCall=true) ,警告消失。

lombok.config

另外,lombok作者Roel也給出了解決辦法,就是通過自定義lombok.config文件來解決。

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

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

注意上面的callSuper=call,並不是true,false

可以看到,配置生效了,然后@Data注解這里的警告也立馬消失了。

參考:

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

lombok踩坑與思考

Lombok用於繼承時應注意的點


免責聲明!

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



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