没有合适的资源?快使用搜索试试~ 我知道了~
java中lombok的@Data引发问题详解
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 5 下载量 103 浏览量
2020-09-08
15:18:37
上传
评论
收藏 63KB PDF 举报
温馨提示
试读
2页
主要给大家介绍了关于java中lombok的@Data引发问题的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
资源推荐
资源详情
资源评论
java中中lombok的的@Data引发问题详解引发问题详解
主要给大家介绍了关于java中lombok的@Data引发问题的相关资料,文中通过图文介绍的非常详细,对大家的
学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
前言前言
我们问题lombok是可以精简我们的代码的,让开发人员把精力放在业务上,而它封装的注解我们在使用时,需要多注意一
下;@Data注解它是一个混合注释,它包含了@Getter @Setter @RequiredArgsConstructor @ToString
@EqualsAndHashCode的功能,而我们问题@EqualsAndHashCode是重写equals和hash的注释,如果你是一个类,那可以
不关心它;而如果你的类中有继承(父类子类),那么就要注意一下了。
危险的危险的@Data
子类不能完全代表父类子类不能完全代表父类
@EqualsAndHashCode注解里有个字段callSuper,它的默认值是false,意思是在重写时,不会将父类的字段写到equals里;
而@Data这个注解由于包含了@EqualsAndHashCode,所以它也有这个特性,即子类强制实现了重写equals和hashCode,
并且只重写了自己的属性,这时,问题就来了,当两个对象比较时,如果子类属性相同而父类属性不同,结果也为true,这是
非常严重的bug。
定义两种类,基类People,和两个子类Man和Woman
@Data
class Person {
String name;
}
@Data
//重写时带上父类字段
@EqualsAndHashCode(callSuper = true)
class Man extends Person {
Boolean hunting;
}
@Data
//重写equals时不会带上父类的字段,同种类型比较时,当子类字段相同时,结果就为true,这显然是不准确的.
@EqualsAndHashCode(callSuper = false)
class Woman extends Person {
Boolean spin;
}
测试的结果,我们是可以猜出来的,父类里的字段不相同时,结果应该为false,但如果 @EqualsAndHashCode(callSuper =
false),结果竟然是true,这也是正常的,因为它并没有重写父类的属性name,所以只要子类字段相同,结果就认为相同了。
@Test
public void supperSubEqual() {
Man man = new Man();
man.setName("zzl");
man.setHunting(true);
Man man1 = new Man();
man1.setHunting(true);
man1.setName("lind");
log.info("man==man1 ? {}", man.equals(man1)); // false
Woman woman = new Woman();
woman.setName("zzl");
woman.setSpin(true);
Woman woman1 = new Woman();
woman1.setSpin(true);
woman1.setName("lind");
log.info("woman==woman1 ? {}", woman.equals(woman1)); // true
}
总结总结
weixin_38707356
- 粉丝: 17
- 资源: 959
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页