我有一个POJO类,它已经定义了equals和hashcode,并用于许多保存到DB的遗留对象,因此不能改变该对象的工作方式。
她是一个简化的代码:
@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
中,以便消除基于这些字段的同一雇员的重复合同。
如果我不能重新定义equals和hashcode,那该怎么做呢?
我最终实现了一个丑陋的老式“比较器”方法,如下所示。它检查一个元素是否与集合中的任何其他元素重复,然后实际添加该元素:
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等可以漂亮,但这稍后会到来。