【问题标题】:Need help in writing hashcode and equals method?在编写 hashcode 和 equals 方法时需要帮助吗?
【发布时间】:2011-11-11 01:07:06
【问题描述】:

我有一个类提供有关付款的详细信息。属性是

    accountNo, transactionAmount, dateOfTransaction.

这里我想写一个哈希函数,这样当我将这个类对象存储在一个 hashSet 中时它会很有效。

主要的限制是付款细节应该是唯一的(假设一个特定的人不应该在一个月内支付两次费用)。

任何人都可以帮助我为这种情况编写 hashCode 以及 equals 方法吗?

【问题讨论】:

  • 您可能会发现 Apache Commons 或 Guava 很有用:stackoverflow.com/questions/5038204/…
  • @satheesh 你确定事务类不需要主键吗?而且,在阅读了您之前的问题后 - 这是什么?作业还是应用程序?您是否将数据保存在某处?
  • @amal 这是给我的任务
  • @satheesh 您是否将数据保存在某处?像分贝?正如下面的 cmets 所述,我认为您只需要在插入您的 collection/table 之前验证数据。覆盖等号似乎不正确。至于标题栏中的问题,您需要知道哈希码是什么。一旦您知道这一点,实施一个将是微不足道的。但是,我不确定您应该采用这种方式来解决这个特定问题。
  • @amal 我明白你在说什么......但是我在这里只写一个没有任何数据库连接的java程序..

标签: java equals hashcode


【解决方案1】:

你需要准确地确定你所说的平等是什么意思。特别是,您谈到在 一个月 内不支付两次 - 这是否意味着即使在不同的日子,同一个月内的一笔交易也应该与另一笔交易相同?这听起来很奇怪 - 并且非常特定于使用而不是特定于类型 - 平等的想法。另请注意,交易只有一个帐号 - 当然它应该同时具有“发件人”和“收件人”帐户,因为可能有多个人向同一个帐户进行付款,并且可能在同一个月内从一个帐户多个帐户付款。

所以,就我个人而言,我不想以这种方式覆盖平等,但如果你真的必须这样做,这并不难......一旦你决定什么构成平等,我会实施equals -那时hashCode 通常相当容易。

强烈建议您阅读 Josh Bloch 在 Effective Java (second edition) 中关于平等的部分以了解更多详细信息,但 equals 通常看起来像这样:

@Override public boolean equals(Object other)
{
    if (other == null || other.getClass() != this.getClass())
    {
        return false;
    }
    BankTransaction otherTransaction = (BankTransaction) other;

    return accountNo == otherTransaction.accountNo 
        && transactionAmount == otherTransaction.transactionAmount
        && // etc;
}

请注意,对于任何 reference 类型的字段,您需要确定要在其中应用哪种相等性 - 通常您需要调用 equals 而不仅仅是使用==提供的参考比较。

【讨论】:

  • 这里学生需要每个月存入账户。如果他试图在同一个月再次存入它应该拒绝。这意味着他不应该为特定目的支付两次。
  • @satheesh:但这听起来并不像交易是“平等的” - 老实说,我认为我不会为此目的覆盖 equals 和 hashCode。
  • ...这是我之前与此相关的问题
  • @satheesh:我的意思是,您之前收到的答案很可能因额外的细节而无效。我只是认为覆盖equals 的方式实际上会为您提供所需的结果是不合适的。您可以这样做并且它会起作用 - 但是一旦您需要以任何其他方式将事务视为平等,您就会陷入困境。这根本不是一种“自然”的平等形式。
【解决方案2】:

我建议你使用apache commons包的hashcodebuilder:

http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/builder/HashCodeBuilder

还有一个 EqualsBuilder:

http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/builder/EqualsBuilder

如果你同时实现了这两个,你不应该担心将你的对象存储在一个哈希集中

【讨论】:

  • 谢谢你,我在等别人说。
  • @leigf,+1,我想说。
  • @satheesh,谷歌是你的朋友。 HashCodeBuilder上的教程。
  • 我提供的链接有一个例子
【解决方案3】:

这个问题的最终答案在Effective Java (second edition)

【讨论】:

  • @Dabiel 你能把与这个问题相关的书的特定部分发给我吗……因为我没有这本书
猜你喜欢
  • 1970-01-01
  • 2012-10-19
  • 2011-05-22
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多