当前位置: 首页 > 面试题库 >

Java:调用hashCode()和equals()时自动抛出UnsupportedOperationException的干净方法?

浦德明
2023-03-14
问题内容

我们有一个面向对象的代码库,在很多情况下hashcode(),它们equals()根本不起作用,主要是由于以下原因:

除非您愿意放弃面向对象抽象的好处,否则没有办法在扩展扩展实例化类和添加值组件的同时保留平等合同。

这是来自约书亚·布洛赫(Joshua Bloch)的“有效Java”的引文,Artima上一篇出色的文章中有关于该主题的更多信息:

http://www.artima.com/lejava/articles/equality.html

我们对此非常满意,这不是这个问题的意思。

问题是:事实是,在某些情况下您不能满足equals()合同要求,自动创建hashcode()equals()引发UnsupportedOperationException
的干净方法是什么?

注释会起作用吗?我在考虑类似这样的事情@NotNull:每个@NotNull违反合同的行为都会自动引发异常,除了用注释参数/返回值外,您无需执行其他操作@NotNull

这很方便,因为它是8个字符(“ @NotNull”),而不是不断重复相同的验证/抛出异常代码。

在我担心的情况下,在每个hashCode()/equals()没有意义的实现中,我们总是在重复同一件事:

@Override
public int hashCode() {
    throw new UnsupportedOperationException( "contract violation: calling hashCode() on such an object makes no sense" );
}

@Override
public boolean equals( Object o ) {
    throw new UnsupportedOperationException( "contract violation: calling equals() on such an object makes no sense" );
}

但是,这很容易出错:我们可能会错误地忘记剪切/粘贴此内容,并且可能导致用户滥用此类对象(例如,尝试将其放入默认Java集合中)。

或者,如果无法通过注释来创建此行为,AOP是否有效?

有趣的是,真正的问题是Java层次结构的存在hashCode()equals()位于Java层次结构的顶部,这在很多情况下根本没有意义。但是,我们如何彻底解决这个问题呢?


问题答案:

为什么不让您的IDE(Eclipse / NetBeans /
IntelliJ)为您生成hashCode()equals()方法。他们在这方面做得很好。

AOP当然可以工作,但这很复杂。这将意味着您将无法使用几乎没有集合或实用程序的这些对象。

另一个合理的解决方案是仅删除那些方法不起作用的实现,从而有效地仅将实现保留在中Object



 类似资料:
  • 本文向大家介绍java集合——Java中的equals和hashCode方法详解,包括了java集合——Java中的equals和hashCode方法详解的使用技巧和注意事项,需要的朋友参考一下 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法,今天就来介绍一些这两个方法的作用。 equals()

  • 本文向大家介绍java中hashCode、equals的使用方法教程,包括了java中hashCode、equals的使用方法教程的使用技巧和注意事项,需要的朋友参考一下 前言 众所周知Java.lang.Object 有一个hashCode()和一个equals()方法,这两个方法在软件设计中扮演着举足轻重的角色。在一些类中重写这两个方法以完成某些重要功能。 1、为什么要用 hashCode()

  • 问题内容: 鉴于这种: 输出为: 这是为每个对象提供false,但每个String对象的哈希码都相同。为什么会这样呢? 问题答案: 确实比较 对象的 真实相等性(我的意思是-两个引用都指向同一个对象),而不是它们的内容,而比较内容(至少对于String)。 并指向不同的对象。 还要注意,如果对象相等,则它们的哈希必须相同,但是如果哈希码相同,则并不意味着对象相等。

  • 问题内容: Bert Bates和Kathy Sierra的SCJP 6学习指南在第554页中指出(除其他要求外) x.hashCode()!= y.hashCode()要求x.equals(y)== false 。 但是Javadoc for Object并未明确提及此类要求。Quote: 如果根据equals(Object)方法,两个对象相等,则在两个对象中的每个对象上调用hashCode方法

  • 菜单栏: Code —> Generate —> equals() and hashCode() 右键菜单:Generate —> equals() and hashCode() 快捷键: Mac: command + N Windows\/Linux: Alt + Insert —> equals() and hashCode()

  • 如果你有如下需求,你必须重载 equals() 和 hashCode() 方法: 想把持久类的实例放入 Set 中(当表示多值关联时,推荐这么做),而且 想重用脱管实例 Hibernate 保证,仅在特定会话范围内,持久化标识(数据库的行)和 Java 标识是等价的。因此,一旦我们混合了从不同会话中获取的实例,如果希望 Set 有明确的语义,就必须实现 equals() 和 hashCode()。