如何解决使用多个字段作为相等比较将对象添加到集合中,以覆盖现有的equals和hashCode方法
我有一个POJO类,该类已经定义了equals和哈希码,并用于保存到数据库的许多旧式对象,因此不能选择更改该对象的工作方式。
她是简化代码:
@EqualsAndHashCode(of = {"id"},callSuper = false)
public class BenefitContract {
private static final Logger LOGGER = LoggerFactory.getLogger(BenefitContract.class);
@Id
@GeneratedValue(generator = "ss_benefit_contract_sequence",strategy = GenerationType.SEQUENCE)
@Column(name = "SS_BENEFIT_CONTRACT_ID")
private Long id;
private UUID guid;
private Benefit benefit;
private LocalDate startDate;
private BigDecimal contractCost;
...
private static Set<BenefitContract> uniqueContracts;
...
}
因此,我想基于雇员,startDate和contractCost将福利合同添加到uniqueContracts
,以便根据这些字段消除同一雇员的重复合同。
鉴于我无法重新定义等于和哈希码,该怎么办?
解决方法
我最终实现了一个丑陋的老式“比较器”方法,如下所示。那会检查一个元素是否与集合中已有的任何其他元素重复,然后将其添加为真实元素:
private boolean addToSet(BenefitContract contract) {
for (BenefitContract bc : uniqueContracts) {
if (isEqual(contract,bc)) {
return false;
}
}
uniqueContracts.add(contract);
return true;
}
private boolean isEqual(BenefitContract t,BenefitContract t1) {
if (t == t1) {
return true;
}
if (Objects.equals(t.getGuid(),t1.getGuid())) {
return true;
}
if (Objects.equals(t.getBenefit(),t1.getBenefit()) &&
Objects.equals(t.getContractCost(),t1.getContractCost()) &&
Objects.equals(t.getStartDate(),t1.getStartDate())) {
return true;
}
return false;
}
//A method that actually does some processing
private process(BenefitContract contract){
...
addToSet(bc);
}
...
}
当然可以使用Java 8等对其进行修饰,但是稍后会出现
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。