Lombok的@EqualsAndHashCode与@Data注解的使用

Lombok的@EqualsAndHashCode与@Data注解的使用

  • 第一点@EqualsAndHashCode用法
@EqualsAndHashCode原文中提到的大致有以下几点:

此注解会生成equals(Objectother)和hashCode()方法。
它默认使用非静态,非瞬态的属性
可通过参数exclude排除一些属性
可通过参数of指定仅使用哪些属性
它默认仅使用该类中定义的属性且不调用父类的方法
可通过callSuper=true解决上一点问题。让其生成的equals方法和hashcode方法包含父类属性
  • 第二点 @Data 用法
@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集。 

通过官方文档,可以得知,当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且不会使用父类的属性,这就导致了可能的问题。
比如,有多个类有相同的部分属性,把它们定义到父类中,恰好id(数据库主键)也在父类中,那么就会存在部分对象在比较时,它们并不相等,却因为lombok自动生成的equals(Object other) 和 hashCode()方法判定为相等,从而导致出错。

修复此问题的方法很简单:

使用@Getter @Setter @ToString代替@Data并且自定义equals(Object other) 和 hashCode()方法,比如有些类只需要判断主键id是否相等即足矣。
或者使用在使用@Data时同时加上@EqualsAndHashCode(callSuper=true)注解。
要让@Data排除掉@EqualsAndHashCode注解,有两种方法可以解决这个问题。第一种方法是使用@Getter、@Setter和@ToString注解代替@Data注解,并自定义equals(Object other)和hashCode()方法。在自定义equals(Object other)和hashCode()方法时,你可以根据需要选择只判断主键id是否相等即可,而不需要使用父类的属性。这样就可以排除掉@EqualsAndHashCode注解。 另一种方法是在使用@Data注解时同时加上@EqualsAndHashCode(callSuper=true)注解。通过官方文档我们可以得知,当使用@Data注解时,会生成默认的equals(Object other)和hashCode()方法,并且不会使用父类的属性。然而,当加上@EqualsAndHashCode(callSuper=true)注解后,就会包括父类的属性在内。所以,通过在@Data注解中加上@EqualsAndHashCode(callSuper=true)注解,也可以实现排除掉@EqualsAndHashCode注解的效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [lombok @Data @EqualsAndHashCode](https://blog.csdn.net/weixin_44766712/article/details/116309428)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [@EqualsAndHashCode() 和@Data注解的关系](https://blog.csdn.net/aiwaston/article/details/104722283)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值