java中lombok出现危险的@ data怎么解决?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
我们问题lombok是可以精简我们的代码的,让开发人员把精力放在业务上,而它封装的注解我们在使用时,需要多注意一下,@ data注解它是一个混合注释,它包含了@ getter @ setter @RequiredArgsConstructor @ToString @EqualsAndHashCode的功能,而我们问题@EqualsAndHashCode是重写=和散列的注释,如果你是一个类,那可以不关心它;而如果你的类中有继承(父类子类),那么就要注意一下了。
<强>子类不能完全代表父类强>
@EqualsAndHashCode注解里有个字段callSuper,它的默认值是false,意思是在重写时,不会将父类的字段写到等于里;而@ data这个注解由于包含了@EqualsAndHashCode,所以它也有这个特性,即子类强制实现了重写equals和hashCode,并且只重写了自己的属性,这时,问题就来了,当两个对象比较时,如果子类属性相同而父类属性不同,结果也为真,这是非常严重的错误。
定义两种类,基类的人,和两个子类男人和女人
@ data 类人{ 字符串名称; } @ data//重写时带上父类字段 @EqualsAndHashCode (callSuper=true) 类人延伸{ 布尔狩猎; } @ data//重写=时不会带上父类的字段,同种类型比较时,当子类字段相同时,结果就为真,这显然是不准确的。 @EqualsAndHashCode (callSuper=false) 类女人人{延伸 布尔旋转; }
测试的结果,我们是可以猜出来的,父类里的字段不相同时,结果应该为false,但如果@EqualsAndHashCode (callSuper=false),结果竟然是真的,这也是正常的,因为它并没有重写父类的属性名称,所以只要子类字段相同,结果就认为相同了。
@Test 公共空间supperSubEqual () { 人=new()人; man.setName (“zzl"); man.setHunting(真正的); 人男士一=new (); man1.setHunting(真正的); man1.setName (“lind"); log.info(“==男士一人,# 63;{}“man.equals(男士一));//错误 女人女人=new女人(); woman.setName (“zzl"); woman.setSpin(真正的); 女人女士一=new女人(); woman1.setSpin(真正的); woman1.setName (“lind"); log.info(“女人==女士一,# 63;{}“woman.equals(女士一));//正确的 }
在使用@ data时,我们尽量把<代码> @EqualsAndHashCode (callSuper=true) 代码>加上,因为你不加,它相当于是假,或者杜绝使用@ data,而用@ getter, @ setter, @ToString代替它。
关于java中lombok出现危险的@ data怎么解决问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。