简述
@Data 注解是Lombok开源项目下的一个注解,只需在实体类上加一个这一个注解,即可快速拥有属性的get、set方法、必须参数的构造方法、重写后的tostring、equals、hashCode方法,省去了大量代码,使得代码简洁,提高开发效率。
问题
父子实体类都使用了@Data后,子类在比较值方面的使用,会有点欠缺,如同样的值使用equals判断却返回false。
下面我们通过实践截图,直观了解一下。
实践
定义两个实体类User、Child;
@Data
public class User {
private String username;
private String userId;
}
@Data
public class Child extends User{
//不加任何属性
}
编写一个测试用例:
class HelloControllerTest {
@Test
void get() {
User user = new User();
user.setUsername("道友");
Child child = new Child();
child.setUsername("道友");
System.out.println(user.equals(child));
}
}
//输出:false
image.png
再实例一个child2对象:
class HelloControllerTest {
@Test
void get() {
User user = new User();
user.setUsername("道友");
Child child = new Child();
child.setUsername("道友");
Child child2 = new Child();
child2.setUsername("道友2");
System.out.println(child.equals(child2));
}
}
//输出:true ---正确结果应该是false
此时修改一下Child实体类:
@EqualsAndHashCode(callSuper = true) //加了此注解
@Data
public class Child extends User{
}
再测试,输出:
image.png
注意:@EqualsAndHashCode(callSuper = true) 只解决了子类实例之间的值比较问题,
未能解决父子之间的问题。