提问者:小点点

使用多个字段作为相等比较将对象添加到集合中,以覆盖现有的equals和hashCode方法


我有一个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,那该怎么做呢?


共1个答案

匿名用户

我最终实现了一个丑陋的老式“比较器”方法,如下所示。它检查一个元素是否与集合中的任何其他元素重复,然后实际添加该元素:

    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等可以漂亮,但这稍后会到来。