使用Lombok子类继承父类,父类属性不生效问题及解决
作者:写....写个大西瓜
在使用Lombok库时,若子类继承父类,父类的属性可能不会自动生效,为解决此问题,可通过在父类上添加@Getter和@Setter注解,或使用@SuperBuilder注解来确保父类属性在子类中有效,同时,需注意确保Lombok版本一致且正确配置了相关插件
使用Lombok子类继承父类,父类属性不生效
子类增加:
@ToString(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Entity @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) public class SysRights extends BaseEntity { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid", strategy = "uuid2") private String rightsId; private String rightsName; private String rightsUrl; private String rightsIcon; }
问题解决~~~~
Lombok 继承时应注意的点
lombok项目的产生就是为了省去我们手动创建getter和setter等基本方法的麻烦,它能够在我们编译源码的时候自动帮我们生成getter和setter等方法。
即它最终能够达到的效果是:
在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法
继承时的@Data
我们知道@Data注解在类,为类的所有字段注解@ToString、@EqualsAndHashCode、@Getter的便捷方法,同时为所有非final字段注解@Setter。
要注意@EqualsAndHashCode注解与@ToString注解默认情况下是忽略父类的成员变量的,测试代码如下:
@Data @NoArgsConstructor @AllArgsConstructor public class School { public int id; public String name; public String age; } @Data class ShangHai extends School { private String type; } class test { public static void main(String[] args) { ShangHai shangHai = new ShangHai(); shangHai.setId(1); shangHai.setName("上海大学"); shangHai.setType("A"); ShangHai shangHai2 = new ShangHai(); shangHai2.setId(2); shangHai2.setName("华东师范"); shangHai2.setType("A"); System.out.println(shangHai.equals(shangHai2)); System.out.println(shangHai.toString()); System.out.println(shangHai2.toString()); } }
它的打印结果是:
true
ShangHai(type=A)
ShangHai(type=A)
在此可以发现,上述的两个实例没有对比父类的成员变量是否相同,仅仅对比的type字段的值,所以是true。同理,toString方法是不会打印父类的成员的。
使父类成员变量参与到逻辑中
这个解决很简单,仅仅需要给注解带上一个参数:
@Data @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) class ShangHai extends School { private String type; }
打印结果:
true
ShangHai(super=School(id=1, name=上海大学, age=null), type=A)
ShangHai(super=School(id=2, name=华东师范, age=null), type=A)
注意:
由上述的代码演示,我们可以知道,在类继承的情况时应注意@Data注解不会涉父类的成员的坑,需要加callSuper = true的参数。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。