当前位置: 首页 > 知识库问答 >
问题:

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

邓仲卿
2023-03-14

我有一个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个答案

吴宝
2023-03-14

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

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

 类似资料:
  • 问题内容: 在Java中重写equals方法以比较多个字段的最佳方法是什么?例如,我在类中有4个对象,分别为o1,o2,o3,o4,我想将所有这些对象与传递给equals方法的对象进行比较。 这段代码的问题在于它不清楚,如果我们有更多字段,就很难轻易修改。有没有更好的方法来实现这一目标? 问题答案: 一种便宜的方法是:

  • 下面是产生散列集大小为3而不是2的代码 您可以看到这两个对象在输出中具有相同的代码,但被计算为不同的,并且产生的代码被计算为3 请协助我如何工作。

  • 问题内容: 关于如何考虑 超字段的 子类中的 Override &in,是否有特定规则?知道有很多参数:超字段是private / public,有/没有getter … 例如,Netbeans生成的equals()和hashCode()不会考虑超级字段…和 将返回true :( 如果要查看Netbeans生成的equals()和hashCode(): 问题答案: 儿童不应该检查父母的私人成员 但

  • 问题内容: 好的,我从很多地方和来源都听说过,每当我覆盖equals()方法时,我也需要覆盖hashCode()方法。但是请考虑以下代码 这里的输出为true,完全按照我想要的方式为false,我根本不关心重写hashCode()方法。这意味着hashCode()覆盖是一种选择,而不是每个人都说的强制性选择。 我想要第二次确认。 问题答案: 它对您有用,因为您的代码未使用任何需要API的功能(Ha

  • 在阅读了大量文档和文章后,我真的对和方法感到非常困惑。主要是,有各种各样的例子和用法让我太困惑了。 那么,你能澄清一下以下几点吗? 1? 2.如果有一个唯一的键,例如,那么我们应该只使用这个字段吗?或者我们应该将它与组合,如下所示? 3.naturaid怎么样?据我所知,它用于唯一字段,例如,<代码>私有字符串isbn 。它的用途是什么?它是否与方法有关?

  • 我不理解javadoc中的这一行(在“API注释”子标题下): StringBuilder实现可比较但不覆盖等于。因此,StringBuilder的自然顺序与equals不一致。 我是Java的初学者,你能简单地解释一下吗?